現在、セマフォとスレッドを使用するオペレーティングシステムクラスの宿題に関する質問に取り組んでいます。非常に混乱し、ここに誰かが助けることができるかと思っていました。私はこれまで持っているコード:私のプログラムがデッドロック状態にならないようにするにはどうすればよいですか? (セマフォ)
01 travelToShop(); //puts thread to sleep between 1 and 1000 cycles
02 s1.acquire(); //lock semaphore, keeps mutual exclusion so no other
03 //thread writes to variable while another one is trying to do the same
04
05 if (numofcust==5){ //cant have more then 5 customers in a "shop"
06 s2.acquire(); //lock the shop, wait until shop reopens
07 }
08 numofcust++; //increases variable telling class how many in shop
09 arriveAtShop(); //print statement saying ive arrived, if i arrived
10 //im technically in shop
11
12 s1.release(); //done writing to numofcust
13 sittingInShop(); //puts thread to sleep between 1 and 1000 cycles
14 //simulating having coffee
15
16 s1.acquire(); //refer to last "s1.acquire()"
17 numofcust--; //simulating leaving the shop
18 if (numofcust==0){ //if shop empty
19 s2.release(); //open the shop
20 }
21 leaveShop();
22 s1.release(); //refer to last "s1.release()"
私は問題を知っているが、一度店頭で5人の顧客があるライン6と12であり、顧客の残りの部分は、(6行目)を待たなければなりません。私が待たなければならないのは、最初にs1を保有している人は、別の顧客が残すために取得しなければならないセマフォを保持しているからです(そのスレッドがそのスレッドを解放するためにスレッドが待っているロックを解放することはできません誰かのためのロックが終了します
IVEはやってみました次:。
05 if (numofcust==5){ //cant have more then 5 customers in a "shop"
06 s1.release(); //release the lock so others can write to numofcust and read
07 s2.acquire(); //lock the shop, wait until shop reopens
08 s1.acquire(); //reacquire the lock so i can write to numofcust again
09 }
をしかし、私は私は誰もロックせずにnumofcustに書き込むことはできません。相互排除を維持するにはどうすればよいの相互排他
を破りましたしかし、waitiから保持されているため、あるスレッドがnumofcustにロックを保持しているデッドロックを防ぐ店が開いているまでは?
EDIT:5人の顧客が店頭で存在する場合、店外のすべてのお客様は、彼らのすべてが去るまで待つ必要がありますが、5人の未満の顧客がある場合、彼らは喜ばとしてで行くことができ
は、私はちょうど私の教授が何のためにそれを目覚めさせると言ったので、おそらくないような場合には、もう一度それを試していない場合、それは、その後、0秒間スリープし、それをウェイクアップし、その利用可能かどうかをチェックするために置かれ、何を言っていると思いますひどい。 –
私はそれが与えられたセマフォークラスが何をしていると信じていますか?(待ちクラスがやっているのですか?) public void synchronized acquire(){ while(value <= 0){ wait(); } 値 - ; } –
これまでのところ、私は彼にセマフォー、ブール値、整数が良いと言ったのを尋ねました。 –