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

时间:2017-02-14 21:57:24

标签: c++ multithreading stl shared-ptr

在调用data(){ return { conversation: [ { } ] }, mounted(){ EventBus.$on('msg-ctr--push-msg-in-conversation', textMsg => { this.conversation.push(textMsg) // Didn't work doing scroll here }) }, updated(){ <=== PUT IT HERE !! var elem = this.$el elem.scrollTop = elem.clientHeight; }, 之后 - p->start()抛出shared_from_this 但正如您可以看到在bad_weak_ptr完全启动后调用的p->start()

shared_ptr

link to working code (coliru) - unexplained bad_weak_ptr - exception is thrown ...

1 个答案:

答案 0 :(得分:5)

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