Spec-Zone.ru › OCaml 5.0

Модуль Потоков

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 ().

  • До версии 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
Устаревшее. Используйте Unix.select вместо этого.

См. Thread.wait_timed_write.

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 . Возвращает 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-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/libref/Thread.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API