gpt4 book ai didi

c++ - "pure virtual method called"实现 boost::thread 包装器接口(interface)时

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:21 24 4
gpt4 key购买 nike

我有一个小包装器,它集中了与线程相关的内容:

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)));
}
};

当我实现它时,请说以下内容:

class A : public Thread {
void work() {}
};

在:

A a; a.run();

我得到了一个运行时终止,并显示了一个漂亮的“调用的纯虚拟方法”。我认为这是 boost::bind 参数,但我不知道如何说“使用虚拟纯实现”...

先谢谢了。

问候,

神秘先生

最佳答案

只有当您的程序立即退出时才会发生崩溃:它调用类 A 的析构函数完成并调用线程的析构函数之前新启动的线程有机会被调度。然后线程调用你的虚函数,但是类A已经不存在了,所以它试图调用Thread的do_work(),它调用的是纯虚work()。这是带有额外输出的程序:

run() started 
run() ended
~A() started
~A() ended
~Thread() started
catch_up() started
do_work() started
pure virtual method called

在标准方面,我认为这是未定义的行为,因为当对对象的引用 (boost::ref(*this)) 被用于从线程调用 do_work()。

解决方案:让线程在销毁对象之前执行:

A a; a.run();
a.catch_up();

或者,如 boost.thread 文档所述,"the user of Boost.Thread must ensure that the referred-to object outlives the newly-created thread of execution."

关于c++ - "pure virtual method called"实现 boost::thread 包装器接口(interface)时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3160403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com