Mis*_*ère 6 c++ multithreading boost pure-virtual
我有一个小包装器,它集中了与线程相关的内容:
class Thread {
protected:
boost::thread *m_thread;
virtual void work() = 0;
void do_work() {
work();
}
public:
Thread() : m_thread(NULL) {}
virtual ~Thread() {
catch_up();
delete m_thread;
}
inline void catch_up() {
if(m_thread != NULL) {
m_thread->join();
}
}
void run() {
m_thread = new boost::thread(boost::bind(&Thread::do_work, boost::ref(*this)));
}
};
Run Code Online (Sandbox Code Playgroud)
当我实现它时,请说明如下:
class A : public Thread {
void work() {}
};
Run Code Online (Sandbox Code Playgroud)
在 :
A a; a.run();
Run Code Online (Sandbox Code Playgroud)
我得到了一个运行时终止,显示了一个非常"纯粹的虚拟方法".我认为这是boost :: bind参数,但我不知道怎么说"使用虚拟纯实现"...
先谢谢了.
问候,
Mystère先生
只有当你的程序立即退出时才会发生崩溃:它会调用类A的析构函数,它会在新启动的线程有机会被调度之前完成并调用Thread的析构函数.然后线程调用你的虚函数,但是类A不再存在,所以它试图调用Thread的do_work(),它调用纯虚函数().这是你的额外输出程序:
run() started
run() ended
~A() started
~A() ended
~Thread() started
catch_up() started
do_work() started
pure virtual method called
Run Code Online (Sandbox Code Playgroud)
标准方面,我认为这是未定义的行为,因为当使用对it(boost::ref(*this))的引用从线程调用do_work()时,对象的生命周期已经结束(析构函数调用开始).
解决方案:在破坏对象之前让线程执行:
A a; a.run();
a.catch_up();
Run Code Online (Sandbox Code Playgroud)
或者,正如boost.thread文档所说,"Boost.Thread的用户必须确保引用的对象超过新创建的执行线程."
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |