Модуль Mutex
module Mutex: sig .. end
Блокировки для взаимного исключения.
Мьютексы (блокировки взаимного исключения) используются для реализации критических секций и защиты общих изменяемых структур данных от одновременного доступа. Типичное использование (если m — мьютекс, связанный со структурой данных D):
Mutex.lock m;
(* Critical section that operates over D *);
Mutex.unlock m
type t
Тип мьютексов.
val create : unit -> t
Возвращает новый мьютекс.
val lock : t -> unit
Заблокировать данный мьютекс. Только один поток может иметь мьютекс заблокированным в любой момент времени. Поток, пытающийся заблокировать мьютекс, уже заблокированный другим потоком, приостановится до тех пор, пока другой поток не разблокирует мьютекс.
-
До 4.12
Sys_errorне генерировалась при рекурсивной блокировке (платформенно-зависимое поведение) -
Возбуждает
Sys_errorесли мьютекс уже заблокирован потоком, вызывающимMutex.lock.
val try_lock : t -> bool
То же, что и Mutex.lock, но не приостанавливает вызывающий поток, если мьютекс уже заблокирован: в этом случае просто возвращает false немедленно. Если мьютекс разблокирован, заблокировать его и вернуть true.
val unlock : t -> unit
Разблокировать данный мьютекс. Другие потоки, приостановленные, пытаясь заблокировать мьютекс, возобновят работу. Мьютекс должен был быть предварительно заблокирован потоком, который вызывает Mutex.unlock.
-
До 4.12
Sys_errorне возбуждалась при разблокировке разблокированного мьютекса или при разблокировке мьютекса из другого потока. -
Возбуждает
Sys_errorесли мьютекс разблокирован или был заблокирован другим потоком.
val protect : t -> (unit -> 'a) -> 'a
protect mutex f выполняет f() в критической секции, где mutex заблокирован (используя Mutex.lock); затем он позаботится об освобождении mutex, независимо от того, вернул ли f() значение или возбудил исключение.
Операция разблокирования гарантируется, что всегда выполняется, даже в случае возбуждения асинхронного исключения (например, Sys.Break) в каком-либо обработчике сигнала.
- С 5.1
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Mutex.html