2016-06-19 9 views
-2

すべて: this pageによると、C++の実装では、スレッドの安全性を保証するために、一般的には原子カウントが使用されますが、これはバグのように見える場合があります。上記のコードが示すようにC++ shared_ptrスレッドの安全を確保する方法は?

`` `

void func2(shared_ptr<int>* x) { 
    shared_ptr<int> a(*x); 
    *a += 1; 
} 

thread func1() { 
shared_ptr<int> a1(new int(10)); 
thread t (func2, &a1); 
return t; 
} 

` ``

関数func2でコピー建設はA1減少の内部参照カウントの後に発生した場合、ポインタは、二回削除されます右?

+7

こちらのバグは、あなたのコードです。 – deviantfan

答えて

4

参照カウントは、参照カウントのみがスレッドセーフであることを保証します。参照されるクラスはスレッドセーフなクラスにはなりません。 std::shared_ptrへのポインタを新しいスレッドに渡すのと同じように、スレッドに安全でないコードを書くのを妨げるわけではありませんが、新しいスレッドがそれ自身のコピーを取得する機会を得る前に破棄します。

スレッドセーフロジックの作成は、依然として担当しています。しかし、スレッドセーフである参照カウントに頼ることができます。

関連する問題