Emacs Lispはスレッド(thread)と呼ばれる限定的な並行性(concurrency)の形式を提供します。Emacsの与えられたインターフェース内のすべてのスレッドは同じメモリーを共有します。Emacs Lisp内の並行性は“概ね協調的(mostly cooperative)”であり、これはEmacsがスレッド間の実効を明確に定義された時間にだけ切り替えることを意味しています。しかしEmacsでのスレッドのサポートは将来よりきめの細かい並行性が可能な方法でデザインされており、正しいプログラムは協調的なスレッドに依存するべきではありません。
現在のところスレッドの切り替えはキーボード入力や非同期プロセスからの出力の待機中(つまりaccept-process-output
の間)、ミューテックスのロックやthread-join
のようなスレッドに関連するブロッキング処理の間での、thread-yield
を介した明示的な要求時に発生します。
Emacs Lispはスレッドの作成や制御、さらにスレッドの同期に有用なミューテックスや条件変数の作成や制御を行うプリミティブを提供します。
グローバル変数はEmacs
Lispのすべてのスレッドの間で共有されますがローカル変数(let
によるダイナミックなバインドはローカル)は異なります。スレッドはそれぞれ自身のカレントバッファー(カレントバッファーを参照)と自身のマッチデータ(マッチデータを参照)を所有します。
let
によるバイディングはEmacs
Lisp実装により特別に処理されることに注意してください。let
の使う以外にこのunwind(巻き戻し)とrewind(巻き戻すための巻き取り)の振る舞いを複製する方法はありません。たとえばunwind-protect
を使用してlet
の独自実装で記述しても変数値をスレッド固有にアレンジすることはできません。
レキシカルバインディング(変数のバインディングのスコーピングルールを参照)の場合には他のEmacs Lispオブジェクト類似するものはクロージ(closure)です。クロージャ内のバインディングはクロージャを呼び出したすべてのスレッド間で共有されます。