2012-03-17 10 views
1

次のコードスレッドセーフです:C++さんのstd ::ベクトルとスレッド安全性

THREAD

std::vector<std::string> myCopy; 
    with_locked_mutex(m) { 
    myCopy = sharedCopy; 
    } 
    myCopy.clear() etc. // -- a 

スレッドB言い換えれば

while(1) { 
    // do things ... 
    with_locked_mutex(m) { 
     sharedCopy.push_back(a); // -- b 
    } 
    } 

、STDの意志COWセマンティクス:: vector(とstd :: stringのも、私は思う)aとbの間の競合条件を作成する?もしそうなら、それを防ぐために私ができることはありますか?

+1

「ベクトル」にはCOWの意味がありますか? (また、それはセマンティクスの一部ではないので、 "COWとして実装された"のようになります。) –

答えて

3

with_locked_mutex(m) { something }とすれば、コードブロックの前にミューテックスが取得され、その後に解放されることを保証すると、2つの操作は相互排除で実行されるため、問題は発生しません。

std::vectorは、とにかにコピーオンライトを使用できません。

2

AFAIK、std::vectorにはCOWのセマンティクスはありません。代入演算子とコピーコンストラクタは常にすべての要素をコピーします。

関連する問題