[解決済み] スレッドセーフとリエントラント
質問
最近、私はある質問をしたのですが、そのタイトルは mallocはスレッドセーフですか? というタイトルで質問し、その中で「mallocはリエントラントですか?
リエントラントはすべてスレッドセーフであるという印象を持っていました。
この仮定は間違っているのでしょうか?
どのように解決するのですか?
リエントラント関数は、Cライブラリのヘッダで公開されているグローバル変数に依存しません ... 例えば、C言語の strtok() と strtok_r() のように。
リエントラント関数は、このポインタをグローバル変数ではなく、スレッド自身のストレージに指定することができます。このストレージは呼び出した関数だけのものなので、中断されたり 再入可能 (リエントラント) であり、ほとんどの場合、関数が実装している以上の相互排除は必要ないため、しばしば スレッドセーフ . しかし、これは定義によって保証されているわけではありません。
errno は、POSIX システムでは少し異なるケースです (そして、これがどのように動作するかの説明では、変わり者扱いされる傾向があります) :)。
要するに、リエントラント はしばしば はスレッドセーフを意味しますが ("use the reentrant version of that function if you're using threads" のように)、スレッドセーフは必ずしもリエントラントを意味しません (逆もあります)。スレッドセーフを見るときは 同時実行 について考える必要があります。関数を使用するためにロックと相互排除の手段を提供しなければならないのであれば、その関数は本質的にスレッドセーフではありません。
しかし、すべての関数がそのどちらかを調べる必要があるわけではありません。
malloc()
はリエントラントである必要がなく、任意のスレッドのエントリポイントの範囲外のものに依存しません(そしてそれ自身はスレッドセーフです)。
静的に割り当てられた値を返す関数は ではなく であり、ミューテックス、フーテックス、あるいは他のアトミックなロック機構を使用しない限り、スレッドセーフではありません。しかし、割り込まれないのであれば、リエントラントである必要はありません。
すなわち
static char *foo(unsigned int flags)
{
static char ret[2] = { 0 };
if (flags & FOO_BAR)
ret[0] = 'c';
else if (flags & BAR_FOO)
ret[0] = 'd';
else
ret[0] = 'e';
ret[1] = 'A';
return ret;
}
ですから、お分かりのように、ある種のロックなしに複数のスレッドにこれを使わせるのは大失敗です...しかし、リエントラントである意味はありません。動的割り当てメモリが組み込みプラットフォームでタブーである場合、そのような事態に陥るでしょう。
純粋な関数型プログラミングでは、リエントラントはしばしば はしません。 関数エントリポイントに渡される定義済み関数や無名関数、再帰などの動作に依存します。
スレッドセーフ」をより良く表現する方法は 同時アクセスに対して安全である の方が必要性をよく表しています。
関連
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] lockステートメントは、ボンネットの中で何をするのでしょうか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】リエントラント関数とは一体何でしょうか?
-
[解決済み] 何がメソッドをスレッドセーフにするのか?そのルールは?
-
[解決済み] スレッドセーフとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
initializer element is not constant "というエラーが表示されるのですが?
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] mallocで文字列を確保する
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】リエントラント関数とは一体何でしょうか?