Previous: , Up: Threads   [Contents][Index]


37.3 条件変数

条件変数(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))
Function: make-condition-variable mutex &optional name

mutexに関連付けられた条件変数を作成する。nameが指定されたら条件変数の名前として与えられる(文字列でなければならない)。これはデバッグにたいする用途のみの名前でありEmacsにとって意味はない。

Function: condition-variable-p object

この関数はobjectが条件変数を表していればt、それ以外はnilをリターンする。

Function: condition-wait cond

他のスレッドによる条件変数condの通知を待機する。この関数は条件変数の通知、またはthread-signalの使用によりシグナルが送信されるまでブロックする。

ミューテックスに関連付けられた条件を所持しないcondition-waitの呼び出しはエラーとなる。

condition-waitは待機中に関連付けられたミューテックスをリリースする。これは別スレッドによる条件通知するためのミューテックス所有を可能にする。

Function: condition-notify cond &optional all

condを通知する。呼び出し前にcondに関連付けられるミューテックスを所有しなければならない。通常はcondition-notifyにより単一の待機中スレッドが目覚めさせられる。しかしallが非nilならcondを待機中のすべてのスレッドに通知される。

condition-notifyは関連付けられたミューテックスを待機中はリリースする。これによりスレッドが条件を待機するためにミューテックスを所有することが可能になる。

Function: condition-name cond

make-condition-variableに渡されたcondの名前をリターンする。

Function: condition-mutex cond

condに関連付けられたミューテックスをリターンする。関連付けられたミューテックスは変更できないことに注意。