我想std::atomic<std::shared_ptr>
在我的代码中使用 a 以便可以自动更新 shared_ptr,但是在访问 shared_ptr 时我遇到了问题。atomic 上的 load() 方法似乎减少了 shared_ptr 上的引用计数,因此如果没有释放它,我实际上无法使用该对象。
这是显示问题的简化代码...
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 步中,引用计数变为零并且对象被删除。
所以我的问题是:如何访问和使用由 atomic 管理的 shared_ptr 而不会破坏它?
(我正在使用 Visual Studio 2012 版本 11.0.50727.1 RTMREL 进行编译)