21xrx.com
2024-12-22 21:21:40 Sunday
登录
文章检索 我的文章 写文章
如何设置C++线程池
2023-07-08 20:50:20 深夜i     --     --
C++ 线程池 设置
return !pool->tasks.empty() || pool->stop;

C++线程池是一种实现并发的基础工具,它通过维护一组可用线程来分发任务。线程池的优势在于可以避免频繁创建和销毁线程带来的开销,提高程序的性能和效率。本篇文章将介绍如何设置C++线程池。

1. 引入头文件和命名空间

#include

#include

#include

using namespace std;

2. 定义任务类

class Task {

public:

  virtual void operator()(){} //虚函数,用于实现任务的执行

};

3. 定义线程池类

class ThreadPool {

public:

  ThreadPool(int size = 4); //线程池构造函数

  void addTask(Task* task); //添加任务到线程池

  ~ThreadPool(); //线程池析构函数

private:

  static void worker(ThreadPool* pool); //工作线程

  vector threads; //线程组

  queue tasks; //任务队列

  mutex queue_mutex; //互斥锁

  condition_variable condition; //条件变量

  bool stop; //线程池是否停止运行

};

4. 线程池构造函数

ThreadPool::ThreadPool(int size):stop(false) {

  for (int i = 0; i < size; i++)

    threads.push_back(new thread(worker, this));

}

5. 工作线程函数

void ThreadPool::worker(ThreadPool* pool) {

  while (true) {

    unique_lock lock(pool->queue_mutex);

    pool->condition.wait(lock, [&]() { return !pool->tasks.empty() || pool->stop; });

    if (pool->stop && pool->tasks.empty())

      return;

    Task* task = pool->tasks.front();

    pool->tasks.pop();

    lock.unlock();

    (*task)(); //执行任务

    delete task;

  }

}

6. 添加任务函数

void ThreadPool::addTask(Task* task) {

  unique_lock lock(queue_mutex);

  tasks.push(task);

  lock.unlock();

  condition.notify_one(); //通知可执行线程

}

7. 线程池析构函数

ThreadPool::~ThreadPool() {

  stop = true;

  condition.notify_all();

  for (thread* th : threads) {

    th->join();

    delete th;

  }

}

通过以上步骤,我们已经完成了C++线程池的设置。在主函数中,我们可以这样使用线程池:

ThreadPool pool(4);

for (int i = 0; i < 8; i++)

  pool.addTask(new Task());

需要注意的是,每个任务类都应该继承自Task类并实现operator()函数,以用于线程池的任务执行。

总之,C++线程池是一种非常有效的并发工具,可以优化多线程程序的性能和效率。通过以上步骤,您可以很容易地设置一个简单的线程池。当然,线程池的实现需要考虑各种复杂的情况和异常处理。如果想要在实际生产环境中应用线程池,需要进行更加严谨的测试和验证。

  
  

评论区

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