40.2 Мьютексы

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

Мьютексы Emacs Lisp являются типа recursive (рекурсивные), что означает, что поток может повторно получить мьютекс, которым он владеет, любое количество раз. Мьютекс отслеживает количество раз, которое он был получен, и каждое получение мьютекса должно сопровождаться освобождением. Последнее освобождение мьютекса потоком возвращает его в состояние без владельца, потенциально позволяя другому потоку получить мьютекс.

Функция: mutexp object

Эта функция возвращает t, если object представляет собой мьютекс Emacs, и nil в противном случае.

Функция: make-mutex &optional name

Создает новый мьютекс и возвращает его. Если указан name, это имя, присвоенное мьютексу. Оно должно быть строкой. Имя предназначено только для целей отладки; для Emacs оно не имеет значения.

Функция: mutex-name mutex

Возвращает имя mutex, указанное при вызове make-mutex.

Функция: mutex-lock mutex

Эта функция будет блокироваться до тех пор, пока этот поток не получит mutex, или пока этот поток не будет сигнализирован с помощью thread-signal. Если mutex уже принадлежит этому потоку, функция просто возвращает управление.

Функция: mutex-unlock mutex

Освобождает mutex. Если mutex не принадлежит этому потоку, произойдет ошибка.

Макрос: with-mutex mutex body…

Этот макрос — самый простой и безопасный способ вычисления форм при удержании мьютекса. Он получает mutex, вызывает body, а затем освобождает mutex. Он возвращает результат body.