从另一个线程调用shared_from_this但在shared_ptr初始化之后获取bad_weak_ptr

Rom*_*oma 3 c++ multithreading stl shared-ptr

以某种方式p->start()被称为 - shared_from_this抛出bad_weak_ptr.
但正如你所看到的那样,p->start()被称为shared_ptr完全启动之后.

struct A : std::enable_shared_from_this<A> 
{
    std::thread* t = nullptr;
    A() {}
    ~A(){ 
        t->join(); 
        delete t; 
    }
    void f() { 
        try{
            auto p = this->shared_from_this(); 
            std::cout << "p:" << p.get() << "\n";
        } catch(...) { 
            std::cout << "Exception !!!\n"; 
        }
    }
    void start() { 
        t = new std::thread(&A::f,this); 
    }
};
std::shared_ptr<A> create() { 
    A* a = new A();
    std::shared_ptr<A> p(a);
    p->start();
    return p;
}
int main()
{   
    int i = 0;
    std::map<int,std::shared_ptr<A>> map;
    while( i < 1024) { 
        auto ptr = create();
        map[i++] = ptr;
    } 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

链接到工作代码(coliru) - unexplained bad_weak_ptr - 抛出异常...

Mar*_*k B 5

你的问题是你有一个竞争条件join.main可能正在退出,破坏地图中的对象.该shared_ptr地图中被破坏,要求其要加入你的对象的析构函数,但为时已晚:在shared_ptr那个enable_shared_from_this想用的是烤面包.然后(竞争条件)在对象自己的线程中它试图从死机上获取共享weak_ptr,这会导致抛出异常并打印消息cout.