使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。並且訪問快取區要互斥
因為緩衝區屬於臨界資源,所以同一時間只能有乙個程序在訪問這個緩衝區,這就需要乙個訊號量mutex 來控制對緩衝區的互斥訪問。而生產者還需要先知道快取區還有沒有空位置,這就需要乙個訊號量empty,當 empty 不為 0 時,生產者才可以放入物品。而消費者需要知道快取區有沒有東西,這就需要乙個訊號量full,當 full 訊號量不為 0 時,消費者才可以取走物品。
#define n 100
typedef int semaphore;
semaphore mutex = 1; // pthread_mutex_t mymutex
semaphore empty = n; // sem_t empty
semaphore full = 0; //sem_t full
void producer()
}void consumer()
}
注意,不能先對緩衝區進行加鎖,再測試訊號量。也就是說,不能先執行 down(mutex) 再執行 down(empty)。如果這麼做了,那麼可能會出現這種情況:生產者對緩衝區加鎖後,執行 down(empty) 操作,發現 empty = 0,此時生產者睡眠。消費者不能進入臨界區,因為生產者對緩衝區加鎖了,消費者就無法執行 up(empty) 操作,empty 永遠都為 0,導致生產者永遠等待下,不會釋放鎖,消費者因此也會永遠等待下去。
而解鎖的時候,不管是消費者還是生產者,都可以互換兩個up ,即先up(&mutex); 還是先 up(&full); 都沒問題,因為乙個不過是把full這個部分放在臨界區操作而已。
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...