问题
在使用自己实现的线程类的时候,偶尔会出现奔溃
virtual ~thread() BOOST_NOEXCEPT {
try {
ensure_thread_over();
}
catch (…) {
//avoid exception;
}
}
class MyThread : public utils::thread
{
public:
void run() {
_run();
}
std::function<void() > _run;
};
这里, _run会析构掉,然后 ~thread 就会奔溃
说明
c++中对象都是先构造成员变量,再调用自身的构造函数;故父类成员变量首先被构造,然后调用父类的构造函数,再构造子类的成员变量,最后调用子类的构造函数。
对象析构时与构造顺序相反,子类先调用自身的析构函数,再调用子类成员变量的析构函数,再调用父类的析构函数,再析构父类的成员变量。
修改
需要子类保证线程退出,不要在父类析构子类的志愿。