Spec-Zone.ru › OCaml

Модуль Thread

module Thread: sig .. end

Лёгковесные потоки для 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

Возвращает идентификатор заданного потока. Идентификатор потока — это целое число, уникально идентифицирующее поток. Его можно использовать для создания структур данных с индексами, соответствующими потокам.

val set_current_thread_name : string -> unit

Задаёт имя потока. Эту функцию следует вызывать из функции потока. Задание имени потока доступно в большинстве систем.

Если эта возможность не реализована, функция ничего не делает, но при включённом выводе предупреждений выводит предупреждение в стандартный поток ошибок.

Предупреждение также выводится в случае сбоя операции.

  • Начиная с версии 5.4
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.

Приостанавливает выполнение вызывающего потока до тех пор, пока на заданном файловом дескрипторе Unix не станет доступен для чтения хотя бы один символ или EOF (wait_timed_read) либо пока не появится возможность записать один символ без блокировки (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 и не в библиотеке потоков виртуальной машины.

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

Та же функция, что и Unix.sigprocmask. sigmask cmd sigs изменяет набор заблокированных сигналов вызывающего потока. Если cmd имеет значение SIG_SETMASK, набор заблокированных сигналов заменяется сигналами из списка sigs. Если cmd имеет значение SIG_BLOCK, сигналы из sigs добавляются в набор заблокированных сигналов. Если cmd имеет значение SIG_UNBLOCK, сигналы из sigs удаляются из набора заблокированных сигналов. sigmask возвращает набор сигналов, которые ранее были заблокированы для этого потока.

val wait_signal : int list -> int

Та же функция, что и Unix.sigwait. 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-2026 INRIA.
https://ocaml.org/manual/5.5/api/Thread.html

Spec-Zone.ru

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