リエントラント
以下のコードにある関数 f も g もリエントラントではない。
上記のコードで、f はグローバル変数 g_var に依存している。したがって、2つのプロセス(スレッド)が f を実行すると、g_var に同時並行的にアクセスし、結果はタイミングに依存することになる。したがって、f はリエントラントではない。その f を呼び出している g もリエントラントではない。
これらを若干変更したリエントラントである版を以下に示す:
新しい版では、グローバル変数 g_var は使われていない。引数を渡して、それに基づいて処理を行って結果を返す。共有される可能性のあるオブジェクトにはアクセスしないようになっている。その代わり、呼出し側が前回の戻り値を引数として渡してやらなければならない。このように、リエントラントなサブルーチンでは、必要な静的データは呼出し側が管理しなければならない。
次のPthreadsを使ったC言語のコードでは、関数functionはスレッドセーフだが、リエントラント(非同期シグナル安全)ではない。Pthreadsのミューテックス関数がリエントラント(非同期シグナル安全)であることは保証されないからである。
この function は複数のスレッドから呼び出されても全く問題はない。
OSによってはプロセスが自身のコードを書きかえることを許している。その理由は様々だが(例えば、BitBltでグラフィックスを高速化するためなど)、呼び出す度にコードが変化している可能性があるなら、リエントラント性との両立は難しい。
しかし、呼び出す度にメモリ上の新たな場所にある機械語コードを実行するなら、コードを書き換えても他の呼び出しには影響せず、両立は不可能ではない。
ユーザー/オブジェクト/プロセスに複数レベルの優先度があることや、マルチプロセッシングがリエントラントなコードの制御を複雑化させている。リエントラントな設計においては、あらゆるアクセスに絶えず注意することが重要であり、ルーチン内の副作用に注意することが重要である。