条件変数(condition variable)は何らかのイベントが発生するまでスレッドをブロックするための手段です。スレッドは別のスレッドが条件を通知した際に目覚めるように条件変数を待機できます。
条件変数はミューテックス、および概念的に何らかの条件に関連付けられます。正しく操作するために、ミューテックスを所有してから待機スレッドはループして、条件のテストを行い条件変数を待機しなければなりません。たとえば:
(with-mutex mutex (while (not global-variable) (condition-wait cond-var)))
ミューテックスはアトミック操作のために、ループは堅牢性のためのものです。これは偽の通知があるかもしれないからです。
同様にミューテックスは条件の通知前に所持されていなければなりません。ミューテックスを所有して条件に関連する変更を行い、それを通知するのが典型的かつ最良なアプローチです:
(with-mutex mutex (setq global-variable (some-computation)) (condition-notify cond-var))
mutexに関連付けられた条件変数を作成する。nameが指定されたら条件変数の名前として与えられる(文字列でなければならない)。これはデバッグにたいする用途のみの名前でありEmacsにとって意味はない。
この関数はobjectが条件変数を表していればt
、それ以外はnil
をリターンする。
他のスレッドによる条件変数condの通知を待機する。この関数は条件変数の通知、またはthread-signal
の使用によりシグナルが送信されるまでブロックする。
ミューテックスに関連付けられた条件を所持しないcondition-wait
の呼び出しはエラーとなる。
condition-wait
は待機中に関連付けられたミューテックスをリリースする。これは別スレッドによる条件通知するためのミューテックス所有を可能にする。
condを通知する。呼び出し前にcondに関連付けられるミューテックスを所有しなければならない。通常はcondition-notify
により単一の待機中スレッドが目覚めさせられる。しかしallが非nil
ならcondを待機中のすべてのスレッドに通知される。
condition-notify
は関連付けられたミューテックスを待機中はリリースする。これによりスレッドが条件を待機するためにミューテックスを所有することが可能になる。
make-condition-variable
に渡されたcondの名前をリターンする。
condに関連付けられたミューテックスをリターンする。関連付けられたミューテックスは変更できないことに注意。