生產者 消費者

2021-09-25 08:29:19 字數 857 閱讀 7948

使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。並且訪問快取區要互斥

因為緩衝區屬於臨界資源,所以同一時間只能有乙個程序在訪問這個緩衝區,這就需要乙個訊號量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 喚...