Emacs Lispでは、スレッドと呼ばれる限定的な形式の並行処理が提供されています。あるEmacsインスタンス内のすべてのスレッドは、同一のメモリを共有します。Emacs Lispにおける並行処理は「概ね協調的」であり、つまりEmacsは明確に定義されたタイミングにおいてのみスレッド間の実行を切り替えます。ただし、Emacsのスレッドサポートは、後に、よりきめ細かな並行処理を可能にするように設計されており、正しいプログラムは協調的スレッド処理に依存すべきではありません。
現在、スレッド切り替えは、thread-yield
による明示的な要求時、キーボード入力や非同期プロセスからのプロセス出力を待機している際(例:accept-process-output 中)、またはミューテックスのロックや thread-join といったスレッドに関連するブロッキング操作中に行われます。
Emacs Lispは、スレッドの生成・制御に加え、スレッド同期に有用なミューテックスや条件変数の生成・制御を行うためのプリミティブを提供しています。
グローバル変数はすべてのEmacs Lispスレッド間で共有されますが、ローカル変数は共有されません—動的なletバインディングはローカルです。また、各スレッドは独自のカレントバッファ(カレントバッファを参照)と独自のマッチデータ(マッチデータを参照)を持っています。
なお、let バインディングは Emacs Lisp
実装において特別な扱いを受けます。このアンワインディングおよびリワインディングの動作を再現するには、let を使用する以外に方法はありません。例えば、unwind-protect を用いて let
を手動で実装しても、変数の値をスレッド固有にすることはできません。
レキシカルバインディング(変数バインディングのスコープ規則を参照)の場合、クロージャはEmacs Lispにおける他のオブジェクトと同様のオブジェクトであり、クロージャ内のバインディングは、そのクロージャを呼び出すすべてのスレッドで共有されます。