한국   대만   중국   일본 
信?量 - ?基百科,自由的百科全? 跳?到?容

信?量

本页使用了标题或全文手工转换
?基百科,自由的百科全?

信?量 (英語: semaphore )又稱? 信?? ,是一?同步?象,用于保持在0至指定最大?之?的一????。??程完成一次?? semaphore ?象的等待( wait )?,?????一;??程完成一次? semaphore ?象的?放( release )?,???加一。?????0,??程等待? semaphore ?象不再能成功直至? semaphore ?象?成 signaled ??。 semaphore ?象的???大于0,? signaled ??;???等于0,? nonsignaled ??。

信?量的?念是由 荷? ?算机科?家 艾?赫?·戴克斯特拉 Edsger W. Dijkstra )?明的 [1] ,?泛的?用于不同的 操作系? 中。在系統中,給予每一個 行程 一個信?量,代表每個行程目前的狀態,未得到控制權的行程會在特定地方被?迫停下來,等待可以繼續進行的訊號到來。如果信號量是一個任意的整數,通常被稱?計數訊號量( Counting semaphore ),或一般訊號量( general semaphore );如果信號量只有二進位的0或1,稱?二進位訊號量( binary semaphore )。

語法 [ ?? ]

計數訊號量具備兩種操作動作,稱?V( signal() )與P( wait() )(?部分?考?常?的“PV操作”)。V操作會增加信號標S的數?,P操作會減少?。

運作方式:

  1. 初始化,給與?一個非負數的整數?。
  2. 執行P( wait() ),信號標S的?將被減少。企圖進入 臨界區段 的行程,需要先執行P( wait() )。當信號標S減?負?時,行程會被?住,不能繼續;當信號標S不?負?時,行程可以獲准進入臨界區段。
  3. 執行V( signal() ),信號標S的?會被增加。結束離開 臨界區段 的行程,將會執行V( signal() )。當信號標S不?負?時,先前被?住的其他行程,將可獲准進入 臨界區段

Windows API 提供的 semaphore [ ?? ]

?程使用 CreateSemaphore CreateSemaphoreEx 函??建一? semaphore ?象 [2] 。此?可以指定 semaphore 的?前???????上限;也可指定 semaphore ?象的名字。其他?程中的?程可以指出已存在的 semaphore ?象的名字通??用 OpenSemaphore 函?打??。

如果多??程在等待一? semaphore ?象,不保?按照先?先出( FIFO )?序?度?些等待?程。外部事件,如?核模式的 ?步?程?用 可改?等待?序。

semaphore ?象? signaled ???,等待函?返回?把? semaphore ?象????1。函? ReleaseSemaphore semaphore ?象的???增加指定的?。任何?程,????有等待完成?? semaphore ?象,也可以使用 ReleaseSemaphore ?增加 semaphore ?象的??。如果 ReleaseSemaphore ?致?象???超?上限,??函??用失?,返回298???:“ Too many posts were made to a semaphore ”。

一??程多次等待同一? semaphore ?象,每次等待操作完成都?降低 semaphore ?象???(直至????0???程阻塞)。然而,通? multiple-object 等待函?使用一???包含着同一? semaphore ?象的多?句柄,不能????? semaphore ?象???的多次下降。

用完 semaphore ?象后,?用 CloseHandle 函????。 semaphore ?象的最后一?句柄被??后,操作系???毁?。?? semaphore ?不影??的???。因此,?? semaphore 前或者?程?止前,要?保已?正??用? ReleaseSemaphore 。否?,?起等待? semaphore ?象的?程?永久阻塞或超?返回。

?? [ ?? ]

?考?料 [ ?? ]

  1. ^ 戴克斯特拉, 艾?赫? . Over de sequentialiteit van procesbeschrijvingen (EWD-74) (PDF) . E·W·戴克斯特拉?案?. 得克?斯大??斯汀分校 美??史中心.   ( 文字版本 )
  2. ^ MSDN:Semaphore Objects . [ 2016-09-05 ] . (原始?容 存? 于2016-09-16).  

外部連結 [ ?? ]