Next: , Previous: , Up: Top   [Contents][Index]


37 スレッド

Emacs Lispはスレッド(thread)と呼ばれる限定的な並行性(concurrency)の形式を提供します。Emacsの与えられたインターフェース内のすべてのスレッドは同じメモリーを共有します。Emacs Lisp内の並行性は“概ね協調的(mostly cooperative)”であり、これはEmacsがスレッド間の実効を明確に定義された時間にだけ切り替えることを意味しています。しかしEmacsでのスレッドのサポートは将来よりきめの細かい並行性が可能な方法でデザインされており、正しいプログラムは協調的なスレッドに依存するべきではありません。

現在のところスレッドの切り替えはキーボード入力や非同期プロセスからの出力の待機中(つまりaccept-process-outputの間)、ミューテックスのロックやthread-joinのようなスレッドに関連するブロッキング処理の間での、thread-yieldを介した明示的な要求時に発生します。

Emacs Lispはスレッドの作成や制御、さらにスレッドの同期に有用なミューテックスや条件変数の作成や制御を行うプリミティブを提供します。

グローバル変数はEmacs Lispのすべてのスレッドの間で共有されますがローカル変数(letによるダイナミックなバインドはローカル)は異なります。スレッドはそれぞれ自身のカレントバッファー(Current Bufferを参照)と自身のマッチデータ(Match Dataを参照)を所有します。

letによるバイディングはEmacs Lisp実装により特別に処理されることに注意してください。letの使う以外にこのunwind(巻き戻し)とrewind(巻き戻すための巻き取り)の振る舞いを複製する方法はありません。たとえばunwind-protectを使用してletの独自実装で記述しても変数値をスレッド固有にアレンジすることはできません。

レキシカルバインディング(Variable Scopingを参照)の場合には他のEmacs Lispオブジェクト類似するものはクロージ(closure)です。クロージャ内のバインディングはクロージャを呼び出したすべてのスレッド間で共有されます。