我開始懷疑信號量的概念;請閱讀以及理解我的問題......確保這個生產者 - 消費者示例不會死鎖的條件?
根據手冊,sem_post
將當信號量的值大於0
更大解鎖線程...所以,如果我有這樣的代碼:
void* producer(void* arg)
{
while(1)
{
sem_wait(&sem_produce);
sem_wait(&mutex);
// Insert item into buffer
sem_post(&mutex);
sem_post(&sem_consume);
}
pthread_exit(NULL);
}
void* consumer(void* arg)
{
while(1)
{
sem_wait(&sem_consume);
sem_wait(&mutex);
// Remove item from buffer
sem_post(&mutex);
sem_post(&sem_produce);
}
pthread_exit(NULL);
}
在哪裏sem_consume
用0
的值初始化,sem_produce
用N
初始化。
如果例如N
消費者在生產者之前運行並嘗試消費會發生什麼?那麼sem_consume
應該有-N
的值,如果接下來有N
插入,sem_consume
和sem_produce
都應該是0
,或者我錯了嗎?那麼這意味着消費者將被卡住,因爲(根據手冊)sem_post
將在信號量的值變得大於零時解鎖線程...
因此,根據我從手冊中瞭解並考慮上述示例,只有這種方式才能正常工作,如果sem_consume
永遠不會達到-N
的價值。
我是對的?如果是的話,我該如何改進這個例子以免卡住?如果答案是否定的,我錯了什麼?
「那麼sem_consume應具有-N的值」。那永遠不會發生。它寫在整個信號手冊上。 [sem_overview manual](http://man7.org/linux/man-pages/man7/sem_overview.7.html)說:「一個信號量是一個整數,它的值**永遠不會低於零**」。 [sem_wait](http://man7.org/linux/man-pages/man3/sem_wait.3.html):「如果信號量當前的值爲零,則調用將阻塞,直到可以執行遞減(即信號量值高於零)或信號處理程序中斷呼叫。「 – kaylum
如果消費者在生產者之前運行,那麼消費者都將等待'sem_consume',直到生產者設法執行'sem_post(&sem_consume)',對嗎?只有一個消費者會爲每個'sem_post(&sem_consume)'運行。在生產者被阻止等待消費者消費之前,會有'N'個項目排隊。 –
奇怪的是,在我的並行編程課程中,我認爲我從老師那裏聽說,信號量的值可能是負值,並且這個負值將表示阻塞線程的數量,如果此值不能爲負,那麼我沒有疑惑。 – OiciTrap