再入可能関数とスレッド セーフ関数には違いがあり、_r で終わる Linux 関数がスレッド セーフか、再入可能 (つまり、非同期シグナル セーフ) か、またはその両方かはわかりません。
1 に答える
それらはスレッドセーフです。
Stevens/Rago APUEは、スレッド セーフ関数 (複数のスレッドによって呼び出されることに関して再入可能) と非同期シグナル セーフ関数 (シグナル ハンドラーに関して再入可能であるため、シグナル ハンドラー内から安全に呼び出すことができる) の違いを教えています。 .
APUE ch 12.5再入可能性には、スレッドセーフではない ~79 個の関数がリストされています。次に ~11 個の同等の再入可能関数があります。これらは *_r 関数です。つまり、これらの 11 を複数のスレッドから同時に呼び出すことができます。
APUE ch 10.6 Reentrant Functionsには、async-signal-safe である ~135 の関数がリストされています。必要に応じて信号配信をブロックします。そのため、シグナル ハンドラー コードで使用できます。async-signal-safeness は、関数がシグナル ハンドラ内で呼び出された場合にのみ問題になることに注意してください。これ以上の詳細は扱いにくいため、シグナルハンドラコードを書かない動機になるかもしれません。
Kerrisk TLPI ch 21 Signals: Signal Handlersには、非同期シグナルセーフな関数の独自のテーブルがあります。興味深いことに、それは APUE とまったく同じではありません。
*._r はいずれも、これらの参照のいずれによっても async-signal-safe としてリストされていません。