21xrx.com
2024-11-22 07:17:13 Friday
登录
文章检索 我的文章 写文章
如何在C++中将线程封装在类中?
2023-07-03 01:24:15 深夜i     --     --
C++ 线程 封装

对于需要使用多线程的C++程序或应用,封装线程类是一个很好的实践方法。封装线程类可以使代码更加容易维护和扩展,而且,面向对象的编程方式可以大大提高代码的复用性。本文将介绍如何在C++中将线程封装在类中。

1. 定义线程类

首先,需要定义一个线程类。这个类可以继承自`std::thread`类,也可以使用`pthread`库直接定义。下面是一个基于`std::thread`类的线程封装类:


class Thread {

public:

  Thread() : mIsRunning(false) {}

  ~Thread() {}

  void start() {

    mThread = std::thread([this]() {

      mIsRunning = true;

      run();

      mIsRunning = false;

    });

  }

  void join() {

    if (mThread.joinable()) {

      mThread.join();

    }

  }

  bool isRunning() const

    return mIsRunning;

  

protected:

  virtual void run() = 0;

private:

  std::thread mThread;

  bool mIsRunning;

};

2. 实现线程任务函数

接下来,需要实现线程任务函数`run()`。这个函数是线程的实际执行函数,其中封装了所有需要在该线程中执行的代码。下面是一个简单的例子:


class MyThread : public Thread {

protected:

  void run() override {

    for (int i = 0; i < 10; ++i) {

      std::cout << "Thread " << std::this_thread::get_id() << ": " << i << std::endl;

      std::this_thread::sleep_for(std::chrono::milliseconds(10));

    }

  }

};

3. 启动和停止线程

创建线程对象并启动线程:


MyThread t;

t.start();

停止线程:


t.join();

4. 线程状态查询

在线程运行期间,可以通过`isRunning()`函数查询线程状态:


if (t.isRunning())

  std::cout << "Thread is running." << std::endl;

else

  std::cout << "Thread is not running." << std::endl;

封装线程类是一种高度可维护的方法,可以使多线程程序的代码更加结构化,从而更加易于阅读和修改。通过线程封装,我们可以从烦琐的线程处理中解脱出来,享受更加美好的编程体验。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复