module Event:sig
..end
頭等同步通訊。
此模組實作了透過管道的同步跨執行緒通訊。如同 John Reppy 的 Concurrent ML 系統,通訊事件是一級值:它們可以獨立建構和組合,然後再提供進行通訊。
type 'a
channel
傳輸 'a
類型值的通訊管道類型。
val new_channel : unit -> 'a channel
回傳一個新的管道。
type +'a
event
回傳 'a
類型結果的通訊事件類型。
val send : 'a channel -> 'a -> unit event
send ch v
回傳一個事件,該事件包含透過管道 ch
發送值 v
。此事件的結果值為 ()
。
val receive : 'a channel -> 'a event
receive ch
回傳一個事件,該事件包含從管道 ch
接收一個值。此事件的結果值為接收到的值。
val always : 'a -> 'a event
always v
回傳一個總是準備好同步的事件。此事件的結果值為 v
。
val choose : 'a event list -> 'a event
choose evl
回傳一個事件,該事件是列表 evl
中所有事件的替代選擇。
val wrap : 'a event -> ('a -> 'b) -> 'b event
wrap ev fn
回傳一個事件,該事件執行與 ev
相同的通訊,然後將後處理函數 fn
應用於回傳值。
val wrap_abort : 'a event -> (unit -> unit) -> 'a event
wrap_abort ev fn
回傳一個事件,該事件執行與 ev
相同的通訊,但如果它未被選中,則會在同步後呼叫函數 fn
。
val guard : (unit -> 'a event) -> 'a event
guard fn
回傳一個事件,當同步時,會計算 fn()
並表現為結果事件。這使得在同步操作時可以計算具有副作用的事件。
val sync : 'a event -> 'a
在事件上「同步」:將事件中指定的所有通訊可能性提供給外部世界,並封鎖直到其中一個通訊成功。回傳該通訊的結果值。
val select : 'a event list -> 'a
在事件的替代選擇上「同步」。 select evl
是 sync(choose evl)
的簡寫。
val poll : 'a event -> 'a option
Event.sync
的非封鎖版本:將事件中指定的所有通訊可能性提供給外部世界,如果可以立即進行其中一個通訊,則執行它並回傳 Some r
,其中 r
是該通訊的結果值。否則,不封鎖並回傳 None
。