2009-04-28 3 views
12

すぐに、共有メモリを使ったメッシュリファインメントアルゴリズムの並列バージョンの作業を開始します。linuxとgccのC++ newオペレータスレッドの安全性4

大学の教授は、コンパイラもstlもスレッドに対応していないため、スレッドの安全性に非常に注意する必要があることを指摘しました。

私はこの質問を探しましたが、答えはコンパイラ(やや多分スレッド対応)とplattform(コンパイラによって使用されるシステムコールがスレッドセーフであるかどうか)によって異なります。

したがって、linuxでは、gcc 4コンパイラが新しい演算子用のスレッドセーフなコードを生成しますか?

これを解決する最良の方法は何ですか問題?多分新しいオペレータへの各呼び出しをロックしますか?

答えて

16

あなたはスレッドをサポートしていますが、安全なnewスレッドを持っていないプラットフォームを見つけることは非常に困難に見える必要があります。実際には、スレッドセーフティnew(とmalloc)が遅い理由の1つです。

一方、スレッドセーフなSTLが必要な場合は、スレッド対応のコンテナを持つIntel TBBが考えられます(すべての操作がスレッドセーフではありません)。

8

一般に、new演算子はスレッドセーフです。しかし、STLと標準ライブラリへの呼び出しに対するスレッドの安全性の保証は、標準によって管理されています。つまり、スレッドが認識されていないということではありません。特定の操作に対するスレッドの安全性。たとえば、読み取り専用の方法でリストを反復処理することは、複数のリーダーに対してスレッドセーフであり、リストを反復して更新することはできません。あなたはその文書を読んで、さまざまな保証が何であるかを見なければなりませんが、それは煩わしいことではなく、理にかなっています。

+0

新しいオペレータはどのような場合にスレッドセーフではありませんか?私はそれについて心配すべきか、それともそれを使うべきですか?あなたのコンパイラプロバイダや実装次第です – Gaston

+1

- あなたは、マルチスレッドの標準ライブラリまたはシングルスレッドのライブラリの間で選択するために取得、Visual C++で、たとえば、それは選択肢の多くはないものの、これらの日のようにほとんど興味のあるすべてのものは、を使用する必要がありますマルチスレッドライブラリ –

2

私は、私が使用していない概念について話している間、私は私はあなたが共有メモリを使用している場合、あなたはおそらくあなたが唯一のPOD型を使用することを確実にするため、および配置新しいを使用することを言及する必要があります感じています。

第2に、共有メモリをLinuxシステムで使用していると一般的に理解されているように、共有メモリを通信として使用してスレッドやメモリを割り当てたり、層。この場合、アプリケーションとライブラリのスレッドの安全性は重要ではありませんが、重要なのは共有メモリ割り当てを使用するスレッドの安全性です。これは、new演算子のスレッドの安全性について尋ねるが有効な関心事であり、それは、またはあなた自身のアロケータを定義することではない場合、新たな配置によって対処することができた場合には、多数のスレッドで一つのプロセスを実行しているとは異なる状況です。

1

これは私の質問に決定的な答えではありません。Googleがの高性能マルチスレッドのmallocを実装したことが分かりました。

あなたの実装がスレッドセーフであるかどうかの疑問にいるのであれば、多分あなたはGoogle Performance Toolsを使用する必要があります。

関連する問題