2013-08-18 37 views

回答

2

好,差應或多或少明顯從man sem_init

  • 如果pshared == 0則信號燈會不會是當前進程外部可見的,並且它可能會在這個過程結束後自動銷燬。因此,僅在屬於此進程的線程之間進行同步纔是有用的,並且由於線程始終共享內存,因此sem參數可以由任何線程直接使用,而無需進一步的操作。

  • 如果pshared != 0那麼該信號將可用於其他進程,前提是它們可以訪問由sem指向的內存。爲此,您將需要共享內存,或者在之後使用fork()繼承它,創建信號量。另外,如果你沒有明確銷燬信號量,在某些實現中(我不知道哪些信號量)信號量可能會泄漏。

當然,你也可以使用一個非零的pshared信號同步線程,只是忽略了過程中的一部分。但是進程信號使用更多的資源,通常是一個操作系統對象,而線程信號通常可以在用戶空間中100%實現;所以這只是在浪費資源。