模块 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 终结器和捕获所有异常的处理程序将被执行。

为了明确引发异常并将触发终结器和捕获所有异常的处理程序,建议编写 raise Thread.Exit 而不是 Thread.exit ()

挂起线程

val delay : float -> unit

delay d 将调用线程的执行挂起 d 秒。在此期间,其他程序线程继续运行。

val join : t -> unit

join th 将调用线程的执行挂起,直到线程 th 终止。

val yield : unit -> unit

重新调度调用线程,而无需挂起它。此函数可用于提供调度提示,告诉调度程序现在是切换到其他线程的最佳时机。

等待文件描述符或进程

以下函数是早期基于 VM 的线程系统中遗留下来的。 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)或可以在给定的 Unix 文件描述符上写入一个字符而不阻塞(wait_timed_write)。最多等待第二个参数给出的时间量(以秒为单位)。如果文件描述符已准备好进行输入/输出,则返回 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 指定的进程终止。返回捕获的子进程的 pid 及其终止状态,与 Unix.wait 相同。

信号管理

信号处理遵循 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 fn 注册 fn 作为未捕获异常的处理程序。

如果新设置的未捕获异常处理程序引发异常,则将调用 Thread.default_uncaught_exception_handler