C++ 共享ptr和线程问题
我目前正在编写的代码有自己的C++ 共享ptr和线程问题,c++,multithreading,shared-ptr,C++,Multithreading,Shared Ptr,我目前正在编写的代码有自己的RefPtr实现,但随机失败 我怀疑这可能是一场经典的数据竞赛RefPtr有一个指向从RefCounted类继承的原始对象的指针。此类包含一个非原子的引用计数器(m_refCount),并且应用程序在通过RefPtr东西访问对象的线程中崩溃。就像RefPtr下的对象被销毁一样。完全不可能 由RefPtr持有的对象实例也由另外两个不修改它(或其内容)的对象持有,我100%确信它们拥有它的共享所有权(因此m_refCount永远不应该低于2) 我确实试着用std::sha
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);
}
}
类SharedObjectA
{
公众:
INTA;
}
类所有者
{
公众:
共享对象a;
}
第二类所有者
{
共享对象;
公众:
共享\u ptr GetSharedObject(){return objectA;}
void SetSharedObject(shared_ptr objA){objectA=objA;}
}
无效的DoSomethingthatakestime(第二所有者*所有者)
{
睡眠(1000+rand()%1000);
共享对象=所有者->获取共享对象();
int value=anObject.a;
std::cout您在访问共享对象时没有任何类型的同步。shared_ptr
在访问指向的对象时不进行任何同步,它只是确保指向的内存在所有引用被销毁后释放
您还需要join()
你的线程在某个时刻。请给出一个真实的可复制的示例。正如你的生成线程的循环应该崩溃一样,因为线程在没有连接或分离的情况下被破坏。你的程序崩溃是因为线程没有连接,而不是因为共享\u ptr
这并不能解释为什么要使用\u count()低于2这是如何解释共享计数下降的?还有?这是崩溃的原因。但这并不能解释为什么shared_ptr.use_count()会低于2。虽然访问shared_ptr下的对象不是线程安全的(并且不能由shared_ptr保证),但引用计数应该是-因此在我的示例中它永远不会低于2