リエントラント【reentrant】再入可能

ある関数やサブルーチン、メソッドなどが実行されている最中に、割り込み処理やマルチスレッドの切り替えによって同じ処理が再度呼び出されることがある。このとき、先行する呼び出しと後続の呼び出しが実行状態やデータを干渉し合わず、それぞれ正常に完了できるならば「リエントラントである」という。逆に、片方の処理がもう片方のデータを破壊したり、競合によって誤った結果を返したりする場合は「リエントラントでない」とされる。
リエントラント性を左右するのは、主に処理対象のデータがどこに置かれているかである。関数内で完結するローカル変数だけを使う処理は、呼び出しのたびにスタック上に独立した作業領域が確保されるため、後続の呼び出しによって状態が乱されることはなく、自ずとリエントラントになる。一方、グローバル変数や静的変数(スタティック変数)、固定されたメモリ領域、I/Oポートなど、複数の呼び出し間で共有される要素を操作する場合は、適切な排他制御(ミューテックスやロックなど)を設けなければデータの不整合や破壊が生じやすい。
リエントラント性が特に重視されるのは、オペレーティングシステム(OS)のカーネル機能やデバイスドライバ、割り込みハンドラ、マルチスレッド環境で共有されるライブラリ関数などである。とりわけ、割り込みハンドラは、それ自体の実行中にさらに別の割り込みで重ねて呼び出される可能性があるため、厳格なリエントラント性が求められる。
リエントラントと混同されやすい概念に「スレッドセーフ」(thread-safe)がある。スレッドセーフは複数のスレッドから同時に利用しても安全であることを意味し、ロックによる排他制御で実現される場合も含む。これに対してリエントラントはより厳格であり、ロックを保持したまま再入した場合にデッドロックが生じるような処理は、スレッドセーフであってもリエントラントとは見なされない。