在 C++11 中,我们可以使用 <thread>
标准库来创建和管理线程。然而,C++ 不像 Java 那样提供一个内置的 Thread
类,而是提供了一个更底层的 API。下面是一个模拟 Java 中 Thread
类功能的 C++11 实现。
我们将创建一个名为 SimpleThread
的类,它将允许用户通过继承来重载 run
方法,并且可以调用 start
成员函数来启动线程。
#include <iostream>
#include <thread>
#include <functional>
class SimpleThread {
public:
using ThreadFunc = std::function<void()>;
SimpleThread(ThreadFunc func) : m_func(func), m_thread() {}
virtual ~SimpleThread() {
if (m_thread.joinable()) {
m_thread.join();
}
}
void start() {
m_thread = std::thread(m_func);
}
protected:
virtual void run() {
// 默认情况下,run 方法不执行任何操作
}
private:
ThreadFunc m_func;
std::thread m_thread;
// 私有构造函数防止直接使用
SimpleThread() = delete;
};
// 示例子类
class MyThread : public SimpleThread {
public:
MyThread() : SimpleThread(std::bind(&MyThread::run, this)) {}
protected:
void run() override {
std::cout << "Running thread: " << std::this_thread::get_id() << std::endl;
// 这里可以添加你的代码
}
};
int main() {
MyThread t;
t.start();
// 主线程继续执行其他任务
std::this_thread::sleep_for(std::chrono::seconds(1));
return 0;
}
在这个实现中,SimpleThread
类接受一个 std::function<void()>
类型的函数对象作为构造参数,这个函数对象将被用来创建并启动线程。run
方法是虚函数,子类可以通过继承 SimpleThread
并重载 run
方法来定义线程的行为。
需要注意的是,C++11 不支持在构造函数中调用虚函数,所以我们使用了 std::bind
来绑定成员函数 run
到 this
指针,从而允许在构造时传递给 SimpleThread
构造函数。
另外,SimpleThread
的默认析构函数会确保如果线程尚未结束,它会被正确地 join。这有助于避免资源泄漏。