リエントラント
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/24 15:52 UTC 版)
この定義はシングルスレッドのプログラミング環境が起源であり、ハードウェア割り込みで割り込まれた制御の流れが割り込みサービスルーチン (ISR) に転送されることから生まれた。ISRが使用するサブルーチンは割り込みをきっかけとして実行される可能性があるため、リエントラントでなければならない。OSのカーネルが使用するサブルーチンの多くは、カーネルで確保済みのリソースを超えられない制限がありリエントラントではない。そのためISRでできることは限られている。例えば、一般にISRからファイルシステムにはアクセスできないし、場合によってはヒープ領域も確保できない。
直接または間接に再帰可能なサブルーチンはリエントラントである。しかし、グローバル変数が処理の流れの中でしか変化しないことを前提としているサブルーチンはリエントラントではない。グローバル変数を更新するサブルーチンが再帰的に呼び出されれば、1回のサブルーチン実行の中でグローバル変数は突然変化することになる。
リエントラント性の概念はシングルスレッドの環境に起源があり、マルチスレッド環境でのスレッドセーフという概念とは異なる。リエントラントなサブルーチンはスレッドセーフにすることもできるが[1]、リエントラントだというだけであらゆる状況でスレッドセーフと言えるわけではない。逆にスレッドセーフなコードはリエントラントである必要はない(後述の例を参照)。
- ^ Kerrisk 2010, p. 657.
- ^ Use reentrant functions for safer signal handling | IBM Developer
- ^ 安全なシグナル処理のために再入可能ファンクションを使う | IBM Developer
- ^ Andrew N. Sloss, Dominic Symes, Chris Wright, John Rayfield (2004). ARM System Developer's Guide. p. 342
- ^ John Regehr (2006) (PDF). Safe and structured use of interrupts in real-time and embedded software
- ^ Man page of PTHREAD_MUTEX
- ^ pthread_mutexattr_settype(3) - Linux man page
- ^ EnterCriticalSection function | Microsoft Docs After a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns.
- ^ Thread-safety and POSIX.1
- ^ Signal Handlers and Async-Signal Safety (Multithreaded Programming Guide) | Oracle
- ^ シグナルハンドラと「非同期シグナル安全」 (マルチスレッドのプログラミング) | Oracle
- リエントラントのページへのリンク