2011-07-15 12 views
2

ボイラプレートマルチスレッドコードがあるとします。以下のように。私は、もしあれば、そのコードを使っている複数のスレッドが常に最新の状態を見ることができるかどうかを疑問に思っていました。私はC++がメモリモデルについてほとんど保証していないことを知っています。そして、私はどこかで、状態の揮発性を宣言するだけでも助けにならないかもしれないと読んでいると思います。しかし実際には人々は喜んでboost :: threadを使いますが、そのドキュメントには、外部の状態だけを使用しない限り、ミューテックスは有用ではないという大きな警告はありません:-)私は、私は何かをするたびに__sync_synchronize()を呼び出すべきですか?boost :: threadとメモリモデル

class Blah { 
    typedef (some horribly complex data structure) State; 
    State state; 
    boost::mutex m; 

(...) 

    void use() 
    { 
     boost::lock_guard<boost::mutex> dummy (m); 
     (do something to state, being especially careful to maintain invariants) 
    } 
}; 

答えて

1

ミューテックスロック/アンロックは、メモリバリアを意味する。 (これはboost :: mutexのドキュメントには記載されていませんが、Boostが依存するすべてのmutex実装に関するドキュメントのどこかに記載されていることが保証されています)。

このコードは問題ありません。

+0

これはpthreadのために文書化されており、それは私のために十分です:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11 – Joe

関連する問題