一般的に new
operator はスレッド セーフです - ただし、STL と標準ライブラリへの呼び出しに対するスレッド セーフの保証は、標準によって管理されています - これは、それらがスレッドを認識しないという意味ではありません - 特定の操作に対して、スレッド セーフの非常に明確な保証が定義されている傾向があります。たとえば、読み取り専用の方法でリストを反復処理することは、複数のリーダーに対してスレッド セーフですが、リストを反復処理して更新を行うことはスレッド セーフではありません。ドキュメントを読んで、さまざまな保証が何であるかを確認する必要がありますが、それらはそれほど面倒ではなく、理にかなっている傾向があります.
私が使用したことのない概念について話している間、共有メモリを使用している場合は、POD タイプのみを使用し、placement new を使用することを確認する必要があることを言及する必要があると思います.
次に、共有メモリを使用している場合、共有メモリを通信層として使用して、スレッドではなく複数のプロセスを使用してメモリを割り当て、「何かを実行」している可能性があります。この場合、アプリケーションとライブラリのスレッド セーフは重要ではありません。ただし、重要なのは、共有メモリ割り当てを使用するすべてのスレッド セーフです。これは、多くのスレッドで 1 つのプロセスを実行する場合とは異なる状況です。この場合、new 演算子のスレッド セーフについて尋ねることは有効な懸念事項であり、そうでない場合は new を配置するか、独自のアロケーターを定義することで対処できます。 /P>
スレッドをサポートしているが、スレッド セーフ new
を持たないプラットフォームを見つけるには、非常に苦労する必要があります。 .実際、new
のスレッドセーフは (そして malloc
) が非常に遅い理由の 1 つです。
一方、スレッド セーフな STL が必要な場合は、スレッド対応コンテナーを持つ Intel TBB を検討してください (ただし、すべての操作がスレッド セーフであるとは限りません)。