复制地址:"pure virtual method called" when implementing a boost::thread wrapper interface
我正在尝试使用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()方法
例如,我有一个扩展Thread的类:
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指针指向的是Thread型对象,而不是CmdWorker
编辑:
测试用例代码位于:http://ideone.com/fqMLF和http://ideone.com/Tmva1
对象似乎是分片的(但这很奇怪,因为使用了指针)
我没有设法给它添加助推器
发布于 2011-09-13 02:59:48
答案就在这个问题中:
"pure virtual method called" when implementing a boost::thread wrapper interface
基本上,当boost::thread对象开始运行时,运行它的对象有时间被删除。
在销毁对象之前,您必须实现手动调用的join方法。
发布于 2011-09-13 02:24:11
ThreadThread线程调试时,我注意到线程指针指向
类型的对象,而不是CmdWorker
也许在代码中的某个地方,CmdWorker对象被切分(即按值复制)为Thread对象?
在最小的测试用例下,你会得到相同的行为吗?
发布于 2011-09-13 02:05:37
通过对非虚函数执行&Thread::Run,可以强制任何从Thread类派生的类使用Thread基类中指定的函数。试着让Thread::运行一个虚拟的void,看看这是否能解决你的问题。
https://stackoverflow.com/questions/7391920
复制相似问题