条件変数とは、スレッドがあるイベントが発生するまでブロックするための仕組みです。スレッドは条件変数を待機し、別のスレッドがその条件を通知した際にウェイクアップされます。
条件変数はミューテックスに関連付けられており、概念的にはある条件に関連付けられています。正しく動作させるには、ミューテックスを取得し、その後、待機中のスレッドがループして条件を判定し、条件変数で待機する必要があります。例えば:
(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 に関連付けられたミューテックスを返します。なお、関連付けられたミューテックスを変更することはできません。