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