Модуль Потоки
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
Генерирует исключение Thread.Exit. В потоке, созданном Thread.create, это приведёт к преждевременному завершению потока, если сама функция потока не обработает исключение. Финализаторы Fun.protect и обработчики исключений «по умолчанию» будут выполнены.
Для явного указания того, что исключение будет сгенерировано и вызовет выполнение финализаторов и обработчиков исключений по умолчанию, рекомендуется использовать raise Thread.Exit вместо Thread.exit ().
-
До версии 5.0 Использулась другая реализация, не основанная на генерации исключений и не выполняющая финализаторы и обработчики исключений по умолчанию. Предыдущая реализация имела другое поведение при вызове вне потока, созданного
Thread.create.
Приостановка потоков
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
val wait_timed_write : Unix.file_descr -> float -> bool
Приостанавливает выполнение вызывающего потока до тех пор, пока для чтения не станет доступен по крайней мере один символ или 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-файлов. Аргументы и результаты имеют такое же значение, как и для Unix.select.
val wait_pid : int -> int * Unix.process_status
Такая же функция, как 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 изменяет набор заблокированных сигналов для вызывающего потока. Если cmd равно SIG_SETMASK, заблокированные сигналы устанавливаются на сигналы в списке sigs. Если cmd равно SIG_BLOCK, сигналы в sigs добавляются к набору заблокированных сигналов. Если cmd равно SIG_UNBLOCK, сигналы в sigs удаляются из набора заблокированных сигналов. sigmask возвращает набор ранее заблокированных сигналов для потока.
val wait_signal : int list -> int
wait_signal sigs приостанавливает выполнение вызывающего потока до тех пор, пока процесс не получит один из сигналов, указанных в списке sigs. Затем он возвращает номер полученного сигнала. Обработчики сигналов, прикреплённые к сигналам в sigs, не будут вызваны. Сигналы sigs должны быть заблокированы перед вызовом wait_signal.
Неперехваченные исключения
val default_uncaught_exception_handler : exn -> unit
Thread.default_uncaught_exception_handler выведет идентификатор потока, исключение и стек вызовов (если доступен).
val set_uncaught_exception_handler : (exn -> unit) -> unit
Thread.set_uncaught_exception_handler fn регистрирует fn как обработчик неперехваченных исключений.
Если новый обработчик неперехваченных исключений сгенерирует исключение, будет вызван Thread.default_uncaught_exception_handler.
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Thread.html