40.2 互斥锁

互斥锁(mutex) 是一种独占锁。在任意时刻,互斥锁只能被零个或一个线程持有。 若一个线程尝试获取已被其他线程持有的互斥锁,该线程会阻塞,直到互斥锁变为可用。

Emacs Lisp 的互斥锁属于 可递归(recursive) 类型,即线程可对自身持有的互斥锁 重复获取任意次数。互斥锁会记录被获取的次数,每次获取都必须对应一次释放。 当线程完成最后一次释放后,互斥锁恢复为无主状态,此时其他线程可获取该锁。

Function: mutexp object

object 为 Emacs 互斥锁对象,该函数返回 t,否则返回 nil

Function: make-mutex &optional name

创建并返回一个新的互斥锁。若指定 name,则为互斥锁命名, 名称必须为字符串。该名称仅用于调试,对 Emacs 无实际意义。

Function: mutex-name mutex

返回 mutex 的名称,即创建时传给 make-mutex 的名称。

Function: mutex-lock mutex

阻塞当前线程,直到获取 mutex,或当前线程被 thread-signal 发送信号。 若 mutex 已由当前线程持有,该函数直接返回。

Function: mutex-unlock mutex

释放 mutex。若当前线程并未持有该互斥锁,会触发错误。

Macro: with-mutex mutex body…

该宏是持有互斥锁执行代码的最简且安全的方式。它先获取 mutex, 执行 body,随后释放互斥锁,并返回 body 的执行结果。