【发布时间】:2010-10-01 00:12:57
【问题描述】:
我刚刚开始学习 C++,我正在尝试制作具有 Java Thread 类的基本功能的 Thread 类。我要做的是创建一个子类,编写一个 Run 方法(在基类中是纯虚拟的)创建一个子类的对象,调用它的 start 方法,然后你就有线程了。
问题在于,在我使用 C++ 的方式中,调度没有正确完成 - 就像 Run 函数不是虚拟的,而是调用了基类的 Run 方法。
这是标题的代码
#ifndef _THREAD_H_
#define _THREAD_H_
#include <pthread.h>
class Thread {
public:
Thread();
void Start();
~Thread();
protected:
virtual void Run() = 0;
private:
static void *RunWrapper(void *);
pthread_t thread;
};
#endif
实现
#include "thread.h"
#include <pthread.h>
Thread::Thread() {
}
void Thread::Start() {
pthread_create(&thread, NULL, Thread::RunWrapper, (void *) this);
}
void *Thread::RunWrapper(void *arg) {
Thread *t = (Thread *) arg;
t->Run();
return arg;
}
Thread::~Thread() {
pthread_join(thread, NULL);
}
以及实际尝试做某事的文件
#include <iostream>
#include "thread.h"
class MyThread : public Thread {
protected:
void Run() {
std::cout << "The thread is runned" << std::endl;
}
};
int main(void) {
MyThread thread;
thread.Start();
return 0;
}
我在过去 10 小时内不断收到的错误是:
pure virtual method called
terminate called without an active exception
【问题讨论】:
-
如果您真的想复制 Java 功能,请复制 java.util.concurrent 包。它具有更高级的多线程概念,例如执行器、期货、锁和互斥锁。但是,如果您要走那么远,只需使用 boost:它已经实现了所有这些东西。