Boost线程破坏多态性
boost thread destroys polymorphism
复制:"纯虚拟方法调用"当实现boost::线程包装器接口
时我正在尝试使用boost线程创建一个更面向对象的线程版本。
所以我创建了一个Thread类:class Thread {
public:
Thread() {}
virtual ~Thread() { thisThread->join(); }
void start() { thisThread = new boost::thread(&Thread::run, this); }
virtual void run() {};
private:
boost::thread *thisThread;
};
这个类在start()中创建线程。像这样:
thisThread = new boost::thread(&Thread::run, this);
问题是,当我创建一个覆盖run()
方法的类时,线程调用线程的run()
方法,而不是新的run()
方法
class CmdWorker: public Thread {
public:
CmdWorker() : Thread() {}
virtual ~CmdWorker() {}
void run() { /* deosn't get called by the thread */ }
};
当我做
Thread *thread = new CmdWorker();
thread.start(); //---> calls run() from Thread instead of run() from CmdWorker
但是为了更清楚:
thread.run(); calls the correct run from CmdWorker, (run() is virtual from Runnable)
知道为什么会发生这种情况或者如何修复吗?
注意:我创建了一个函数(与Thread类无关)
void callRun(Thread* thread) {
thread->run();
}
并将线程创建更改为:
thisThread = new boost::thread(callRun, this);
调试时,我注意到thread
指针指向线程类型的对象,而不是CmdWorker
测试用例代码:http://ideone.com/fqMLF和http://ideone.com/Tmva1
对象似乎被切片(但这是奇怪的,因为使用指针)
没有给它添加boost
答案就在那个问题里:
pure virtual method called"当实现boost::线程包装器接口
时基本上,当boost::thread对象开始运行时,它所运行的对象具有要删除的时间。
必须在销毁对象之前手动调用join
方法。
调试时,我注意到线程指针指向a线程类型的对象,而不是CmdWorker
也许CmdWorker
对象被切片(即按值复制)成一个Thread
对象在你的代码的某个地方?
您是否使用最小的测试用例获得相同的行为?
通过对非虚函数执行&Thread::Run
,您将强制从Thread派生的任何类使用Thread基类中指定的函数。试着让Thread::运行一个虚拟void,看看是否能解决你的问题。
从阅读你的更新,你在主线程中调用删除,而线程在另一个开始。根据析构函数和run
调用之间的竞争,它将:
- 在启动前崩溃,因为虚表被完全破坏
- 调用Thread::run(这是纯虚拟的,并且会崩溃)
- 调用正确的函数,它是派生类run()
如果您在调用start之后,但在调用delete
之前添加对sleep(1)
的调用,您会发现它像您预期的那样工作。
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 如何用多态性管理线程资源?(C++)
- Boost线程破坏多态性