信?量
(英語:
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操作會減少?。
運作方式:
- 初始化,給與?一個非負數的整數?。
- 執行P(
wait()
),信號標S的?將被減少。企圖進入
臨界區段
的行程,需要先執行P(
wait()
)。當信號標S減?負?時,行程會被?住,不能繼續;當信號標S不?負?時,行程可以獲准進入臨界區段。
- 執行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
?象的?程?永久阻塞或超?返回。
??
[
??
]
?考?料
[
??
]
外部連結
[
??
]