コードでa を使用しstd::atomic<std::shared_ptr>
て、shared_ptr をアトミックに更新できるようにしたいのですが、shared_ptr にアクセスするときに問題があります。アトミックの load() メソッドは、shared_ptr の ref-count を減らしているように見えるため、割り当てを解除しないとオブジェクトを実際に使用できません。
これは、問題を示す簡略化されたコードです...
typedef shared_ptr<MyClass> MyClassPtr;
typedef atomic<MyClassPtr> MyClassAtomicPtr;
// 1.
MyClassPtr ptr( new MyClass() );
printf("1. use_count=%d\n", ptr.use_count());
// 2.
MyClassAtomicPtr atomicPointer(ptr);
printf("2. use_count=%d\n", ptr.use_count());
// 3.
{
MyClassPtr p = atomicPointer.load();
printf("3a. use_count=%d\n", ptr.use_count());
}
printf("3b. use_count=%d\n", ptr.use_count());
// 4.
{
MyClassPtr p = atomicPointer.load();
printf("4a. use_count=%d\n", ptr.use_count());
}
printf("4b. use_count=%d\n", ptr.use_count());
これの出力は次のとおりです。
1. use_count=1
2. use_count=2
3a. use_count=2
3b. use_count=1
4a. use_count=1
4b. use_count=-572662307
手順 1 と 2 は理解していますが、手順 3 では、shared_ptr への割り当てによって ref-count が 3 に増加し、範囲外になると ref-count が 2 に戻ると予想されます。しかし、実際、割り当てられたときは 2 のままで、shared_ptr が範囲外になると 1 に減少します。同様に、手順 4 では、ref-count がゼロになり、オブジェクトが削除されます。
私の質問は、アトミックによって管理されている shared_ptr を破棄せずにアクセスして使用するにはどうすればよいですか?
(私は Visual Studio 2012 バージョン 11.0.50727.1 RTMREL でコンパイルしていました)