[英]POSIX: value of a semaphore after exiting sem_wait()
信號量初始化為值0。
sem_t sem;
sem_init(&sem, 0, 0);
執行的一行等待信號量,而另一行則將其解鎖。 首先,是服務生必須等待的情況。
// value is 0
sem_wait(&sem); // blocks
// value is 0
sem_post(&sem);
// value becomes 1
// unblocked
第二,服務員不必等待的情況。
// value is 0
sem_post(&sem);
// value becomes 1
// value is 1
sem_wait(&sem); // does not block
// value has become 0
問題在於sem
的最終值在兩種情況下是不同的:第一種情況下為1,第二種情況下為0。 這是一種比賽條件。
理想情況下,在以下情況下不會發生此問題:
sem_wait()
,該值將變為-1,而不是保持為0。這樣,兩種情況下的最終值都將為0。 sem_post()
的變體,它將喚醒一個進程或增加該值(如果有正在等待的進程,則該值不會增加)。 同樣,兩種情況下的最終值均為0 有沒有辦法解決POSIX中的這種差異?
我會說您對第一種情況的最終假設是錯誤的。
從阻塞調用返回sem_wait()
,信號量會遞減,因此最終的值為0
。
來自man sem_wait()
(我的斜體字 ):
sem_wait()遞減(鎖定)sem指向的信號量。 如果信號量的值大於零,則減量繼續進行,函數立即返回。 如果信號燈當前的值為零,則調用將阻塞, 直到有可能執行減量操作 (即信號燈值升至零以上),或者信號處理程序中斷該調用為止 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.