10

背景は私のこの質問にあります。簡単に言う fork、マルチスレッド C++ プログラムで実行する必要があるため、再入可能な関数のみに制限されている場合にどれだけのことができるかを調べたいと思います。最も重要なことの 1 つは動的メモリです。

したがって、malloc再入不可であることが知られています。しかし、C++ の場合はnewどうでしょうか? 関連する結果はあまりありませんでしたが(ほとんどの場合、正しい「新しい」をヒットするのが難しいためです)、 reentrantでnew あるクレームが少なくとも1つあります。C++ 標準ライブラリ全体に関する関連する質問もありますが、満足のいく答えはありません。

編集:標準はこれについて何も言っていないと思うので、私は主に主要な実装について心配しています。

4

3 に答える 3

3

標準準拠の C++ の new/delete 演算子を置き換えるために、 gcc libsupc++clang libc++の両方のソースを調べましたmalloc

これらは基本的に、いくつかの EH ロジックなどのラッパーですmallocfree私は言語の専門家ではありませんが、どちらも間違っていない限り、次のように結論付けても安全だと思います。

于 2012-12-30T12:19:18.737 に答える
3

Standardは単なるラッパーであることを許可 するため、再入可能でない場合は、再入可能です。newmallocmallocnew

于 2012-12-30T12:29:41.587 に答える
1

スレッドセーフと再入可能性はまったく同じではありません。

私の知る限り、C++ ISO標準はnewanddelete演算子のスレッドセーフを保証していません。しかし、g++実装はスレッド セーフを提供します (これが遅い理由の 1 つです)。

于 2012-12-30T12:19:09.253 に答える