2012-12-28 78 views
2

如果你有一個線程(線程1)阻擋在sem_wait()和另一個線程(線程2)破壞是非常旗語,使用sem_destroy(),那麼會發生什麼線程1?sem_destroy一個信號量別人擁有一個sem_wait嗎?

A quick search on the internet tells me that it produces undefined behavior:

銷燬信號量,目前被阻塞在其他的進程或線程(以sem_wait(3))將產生不確定的行爲。

但是,我碰巧看到這被用在許多多線程C++應用程序中。

我的主要問題:

  • 莫不是在此的任何目的是什麼?
  • 他們試圖達到什麼目的(例如,這會隱式終止線程)?
  • 這不應該是非常不安全的嗎?
+5

'它只是恰巧,我一直在讀在這裏,有許多最近的多線程C++應用程序來學習一些好的編碼實踐,我已經看到了這一點做多times'這是極其非不足爲奇。即使您看到它在Linux內核中完成,也不要依賴未定義的行爲。 – Falmarri

回答

3

我不能想到任何API中的單個案例我聽說過,在使用中間的東西時,銷燬某些東西是理智的或定義的。所以在我看來你的問題的答案是:

那麼他們試圖實現什麼?

我不知道。

不應該說是非常不安全的?

是的!

也許你看着那些其他程序的作者都知道什麼樣的實現實際上做的,是依靠它。但他們必須爲未來可能發生變化做好準備。也許他們已經權衡了這樣一種變化的風險,他們通過採取捷徑並依賴未定義的行爲並且認爲它值得。你必須爲自己做出判斷。

相關問題