shared_ptr和线程问题
shared_ptr and threads issue
我目前正在处理的代码有自己的RefPtr
实现,但它随机失败了。
我怀疑这可能是一场经典的数据竞赛。RefPtr
有一个指向从RefCounted
类继承的原始对象的指针。这个类包含一个非原子的引用计数器(m_refCount
),并且一个应用程序在某个线程通过RefPtr
访问对象时崩溃。就像RefPtr
下的对象被破坏了一样。完全不可能。
RefPtr
持有的对象实例也由另外两个对象持有,它们不修改它(或它的内容),我100%确信它们共享它的所有权(所以m_refCount
永远不应该低于2)
我确实尝试用std::shared_ptr
替换指针,但崩溃仍然存在。
代表此问题的提取代码:
class SharedObjectA
{
public:
int a;
}
class Owner
{
public:
shared_ptr<SharedObjectA> objectA;
}
class SecondOwner
{
shared_ptr<SharedObjectA> objcectA;
public:
shared_ptr<SharedObjectA> GetSharedObject() { return objectA;}
void SetSharedObject(shared_ptr<SharedObjectA> objA) { objectA = objA;}
}
void doSomethingThatTakesTime(SecondOwnerA* owner)
{
sleep(1000+rand()%1000);
shared_ptr<SharedObjectA> anObject = owner->GetSharedObject();
int value = anObject.a;
std::cout << " says: " << value;
}
int main()
{
Owner ownerA;
ownerA.objectA.reset(new SharedObjectA());
SecondOwner secondOwner;
secondOwner.SetSharedObject(ownerA.objectA);
//objectA instance
while(true)
{
for(int i=0;i<4;i++)
{
std::thread tr(doSomethingThatTakesTime,secondOwner);
}
sleep(4*1000);
}
}
现在发生的情况是,多达4个线程使用GetSharedObject
访问SharedObject
并使用它做一些事情
然而,在给它一段时间后,shared_ptr
的use_count()
将下降到2以下(不应该),并最终下降到1以下,因此object(objectA)
将被摧毁。
编辑显然,此代码中没有同步。然而,我看不出这与use_count()低于2的事实有什么关系。为了引用计数,sharedptr被保证是线程安全的,不是吗?
在访问共享对象时没有任何类型的同步。shared_ptr
在访问指向对象时不进行任何同步,它只是确保指向的内存在所有引用都被破坏后被释放。
您还需要在某个时刻join()
您的线程。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- MFC执行线程问题
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- VS2017 Linux C 线程问题
- 由于线程问题,Qt-Gui没有更新
- shared_ptr和线程问题
- 线程问题
- 奇怪的线程问题
- 显示Q对话框时出现QT线程问题
- gdal多线程问题
- Qt:QList线程问题
- C#封送以调用C++DLL.COM和线程问题
- C++ 线程问题
- C++11 多线程问题
- 消息框线程问题
- boost::d ynamic_bitset 多线程问题
- 标准::线程问题
- Android 的 c++11 多线程问题,其中某些线程未正确调度
- C++ 提升线程问题
- concurrent_vector vs 矢量与互斥锁,线程问题与push_back