簡體   English   中英

POSIX:退出sem_wait()后的信號量值

[英]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。 這是一種比賽條件。

理想情況下,在以下情況下不會發生此問題:

  • 當信號量的值為0並sem_wait() ,該值將變為-1,而不是保持為0。這樣,兩種情況下的最終值都將為0。
  • 或者,存在sem_post()的變體,它將喚醒一個進程增加該值(如果有正在等待的進程,則該值不會增加)。 同樣,兩種情況下的最終值均為0

有沒有辦法解決POSIX中的這種差異?

我會說您對第一種情況的最終假設是錯誤的。

從阻塞調用返回sem_wait() ,信號量會遞減,因此最終的值為0

來自man sem_wait() (我的斜體字 ):

sem_wait()遞減(鎖定)sem指向的信號量。 如果信號量的值大於零,則減量繼續進行,函數立即返回。 如果信號燈當前的值為零,則調用將阻塞, 直到有可能執行減量操作 (即信號燈值升至零以上),或者信號處理程序中斷該調用為止

上面的措詞不同於POSIX所使用措詞 ,但是,這有助於闡明信號量的“值”如何與信號量鎖定狀態相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM