Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享ptr和线程问题_C++_Multithreading_Shared Ptr - Fatal编程技术网

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