模組 Thread

module Thread: sig .. end

適用於 Posix 1003.1c 和 Win32 的輕量級執行緒。


type t 

執行緒句柄的類型。

執行緒建立與終止

val create : ('a -> 'b) -> 'a -> t

Thread.create funct arg 建立一個新的控制執行緒,其中函數應用 funct arg 與網域中的其他執行緒並行執行。Thread.create 的應用返回新建立的執行緒的句柄。當應用 funct arg 正常返回,或者通過引發 Thread.Exit 例外,或通過引發任何其他未捕獲的例外而終止時,新的執行緒會終止。在最後一種情況下,未捕獲的例外會印在標準錯誤輸出上,但不會傳播回父執行緒。同樣地,應用 funct arg 的結果會被丟棄,並且無法直接被父執行緒存取。

如果您需要平行執行,請參閱 Domain.spawn

val self : unit -> t

返回目前正在執行的執行緒的句柄。

val id : t -> int

返回給定執行緒的識別符。執行緒識別符是一個整數,可唯一識別執行緒。它可以用來建立由執行緒索引的資料結構。

exception Exit

使用者程式碼引發的例外,用於啟動目前執行緒的終止。在由 Thread.create funct arg 建立的執行緒中,如果 Thread.Exit 例外到達應用 funct arg 的頂端,它會產生靜默終止目前執行緒的效果。在其他情況下,Thread.Exit 例外沒有隱含的處理方式。

val exit : unit -> unit
已過時。請改用 'raise Thread.Exit'。

引發 Thread.Exit 例外。在由 Thread.create 建立的執行緒中,除非執行緒函數自行處理例外,否則這會導致執行緒過早終止。Fun.protect 終結器和 catch-all 例外處理器將會被執行。

為了明確指出例外已被引發,並且將觸發終結器和 catch-all 例外處理器,建議寫成 raise Thread.Exit 而不是 Thread.exit ()

暫停執行緒

val delay : float -> unit

delay d 會暫停呼叫執行緒的執行 d 秒。在此期間,其他程式執行緒會繼續執行。

val join : t -> unit

join th 會暫停呼叫執行緒的執行,直到執行緒 th 終止。

val yield : unit -> unit

重新排程呼叫執行緒,而不暫停它。此函數可用於提供排程提示,告訴排程器現在是切換到其他執行緒的好時機。

等待檔案描述符或程序

以下函數是早期基於虛擬機器的執行緒系統遺留下來的。Unix 模組以更通用和更符合標準的方式提供了等效的功能。建議直接使用 Unix 函數。

val wait_timed_read : Unix.file_descr -> float -> bool
已過時。請改用 Unix.select。
val wait_timed_write : Unix.file_descr -> float -> bool
已過時。請改用 Unix.select。

暫停呼叫執行緒的執行,直到至少有一個字元或 EOF 可供讀取 (wait_timed_read),或者可以在不阻塞的情況下寫入一個字元 (wait_timed_write) 到給定的 Unix 檔案描述符。最多等待以第二個引數給定的時間量(以秒為單位)。如果檔案描述符已準備好進行輸入/輸出,則返回 true;如果逾時到期,則返回 false。可以使用 Unix.select 來實現相同的功能。

val select : Unix.file_descr list ->
Unix.file_descr list ->
Unix.file_descr list ->
float -> Unix.file_descr list * Unix.file_descr list * Unix.file_descr list
已過時。請改用 Unix.select。

Unix.select 相同的函數。暫停呼叫執行緒的執行,直到可以在給定的 Unix 檔案描述符上進行輸入/輸出。引數和結果的含義與 Unix.select 相同。

val wait_pid : int -> int * Unix.process_status
已過時。請改用 Unix.waitpid。

Unix.waitpid 相同的函數。wait_pid p 會暫停呼叫執行緒的執行,直到由程序識別符 p 指定的程序終止。根據 Unix.wait,返回捕獲的子程序的 pid 及其終止狀態。

訊號管理

訊號處理遵循 POSIX 執行緒模型:由執行緒產生的訊號會傳遞到該執行緒;外部產生的訊號會傳遞到不封鎖它的其中一個執行緒。每個執行緒都擁有一組封鎖的訊號,可以使用 Thread.sigmask 修改。此集合在執行緒建立時繼承。每個執行緒的訊號遮罩僅受 Unix 下的系統執行緒函式庫支援,不受 Win32 支援,也不受 VM 執行緒函式庫支援。

val sigmask : Unix.sigprocmask_command -> int list -> int list

sigmask cmd sigs 會變更呼叫執行緒的封鎖訊號集合。如果 cmdSIG_SETMASK,則封鎖的訊號會設定為清單 sigs 中的訊號。如果 cmdSIG_BLOCK,則 sigs 中的訊號會新增到封鎖的訊號集合。如果 cmdSIG_UNBLOCK,則會從封鎖的訊號集合中移除 sigs 中的訊號。sigmask 返回執行緒先前封鎖的訊號集合。

val wait_signal : int list -> int

wait_signal sigs 會暫停呼叫執行緒的執行,直到程序收到清單 sigs 中指定的其中一個訊號。然後,它返回收到的訊號的號碼。不會調用附加到 sigs 中訊號的訊號處理常式。預期在呼叫 wait_signal 之前,會先封鎖訊號 sigs

未捕獲的例外

val default_uncaught_exception_handler : exn -> unit

Thread.default_uncaught_exception_handler 將列印執行緒的 ID、例外和回溯 (如果有的話)。

val set_uncaught_exception_handler : (exn -> unit) -> unit

Thread.set_uncaught_exception_handler fnfn 註冊為未捕獲例外的處理常式。

如果新設定的未捕獲例外處理常式引發例外,將會呼叫 Thread.default_uncaught_exception_handler