1.理解生產者和消費者問題
沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?
用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。
結果不唯一:假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作;同時消費者取走一樣產品,擬執行產品數減一操作;假如兩者交替執行加一或減一操作,取決於其執行速度,產品數為9或7,但正確為8.
永遠等待:假如消費者讀取產品數為0時,排程程式暫停消費者程序,讓生產者程序執行,生產者加入乙個產品,將產品數加一,它便呼叫wakeup()函式來喚醒消費者;但是消費者未睡眠,則喚醒訊號丟失,當消費者下次執行時,因已檢測到產品數為0,於是去睡眠,當生產者將緩衝區填滿後也去睡眠,這就會造成永遠等待。
2.哲學家吃麵問題
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( )
coend
4.理髮師問題
int waiting=0, chairs=n;
semaphore customers=0,barbers=0,mutex=1;
cobegin
process barbers() }
process customer_i()
process p2()
coend.
用訊號量程序同步與互斥
1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?出現結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...
用訊號量程序同步與互斥
1.理解生產者和消費者問題 1 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...
程序同步與互斥 POSIX有名訊號量
在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。前面我們學習了無名訊號量的使用 詳情請看 無名訊號...