21xrx.com
2024-11-08 22:05:10 Friday
登录
文章检索 我的文章 写文章
C++线程池的实现
2023-07-06 13:19:43 深夜i     --     --
C++ 线程池 实现
return stop || !tasks.empty();

C++线程池是一种解决多线程任务调度的工具,可以充分利用CPU资源,提高程序的执行效率和并发性。本文将介绍C++线程池的实现与应用。

一、线程池的原理和作用

线程池是指预先创建多个线程,将多个任务分配到这些线程中执行。线程池中的线程可以复用,不需要重复创建和销毁,避免了频繁地创建和销毁线程带来的开销和性能损失。同时,线程池中的任务可以根据资源情况和优先级来动态地调度和分配,实现任务的均衡和高效执行。

线程池的应用场景包括但不限于:网络服务器、图像处理、数据分析、算法优化、任务队列等,特别是在C++中,线程池的应用几乎是无处不在的。

二、C++线程池的实现

C++线程池可以使用C++标准库的线程和同步机制实现,也可以使用第三方库或自行封装实现。下面以一个简单的实现为例:

头文件 ThreadPool.h:


#include <queue>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <functional>

#include <vector>

class ThreadPool {

public:

  ThreadPool(size_t n_threads);

  ~ThreadPool();

  void add_task(std::function<void()> task);

private:

  std::vector<std::thread> workers;

  std::queue<std::function<void()>> tasks;

  std::mutex mutex;

  std::condition_variable cond;

  bool stop;

};

#endif /* THREADPOOL_H_ */

实现文件 ThreadPool.cpp:


#include "ThreadPool.h"

ThreadPool::ThreadPool(size_t n_threads)

  : stop(false)

{

  for (size_t i = 0; i < n_threads; ++i) {

    workers.emplace_back(

      [this] {

        for (;;) {

          std::function<void()> task;

          {

            std::unique_lock<std::mutex> lock(mutex);

            cond.wait(lock, [this] { return stop || !tasks.empty(); });

            if (stop && tasks.empty())

              return;

            task = std::move(tasks.front());

            tasks.pop();

          }

          task();

        }

      }

    );

  }

}

ThreadPool::~ThreadPool()

{

  {

    std::unique_lock<std::mutex> lock(mutex);

    stop = true;

  }

  cond.notify_all();

  for (auto& worker : workers)

    worker.join();

}

void ThreadPool::add_task(std::function<void()> task)

{

  {

    std::unique_lock<std::mutex> lock(mutex);

    tasks.emplace(std::move(task));

  }

  cond.notify_one();

}

三、线程池的使用

使用C++线程池需要先创建一个ThreadPool对象,指定线程池的线程数量。然后可以通过add_task()函数来添加任务。任务可以是一个函数、一个函数对象、一个Lambda表达式或一个函数指针。

示例代码:


#include "ThreadPool.h"

#include <iostream>

int main()

{

  ThreadPool pool(4);

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

    pool.add_task([i] {

      std::cout << "Task " << i << " executed by thread " << std::this_thread::get_id() << std::endl;

    });

  }

  return 0;

}

运行结果:


Task 1 executed by thread 139697256773760

Task 2 executed by thread 139697248381056

Task 3 executed by thread 139697264559872

Task 4 executed by thread 139697255051008

Task 5 executed by thread 139697248381056

Task 6 executed by thread 139697256773760

Task 7 executed by thread 139697255051008

Task 8 executed by thread 139697264559872

Task 9 executed by thread 139697248381056

Task 10 executed by thread 139697256773760

可以看到,线程池中的10个任务被4个线程异步地执行,可以有效地提高程序的执行效率和并发性。

四、总结

线程池是一种常用的多线程调度工具,在C++中也有多种实现方式。本文介绍了一种基于C++标准库的简单实现,不仅可以方便地调度任务,也可以避免多线程环境下的竞态条件和死锁等问题。使用线程池可以极大地提高程序的扩展性、可维护性和可读性,是一种值得推荐的编程范式。

  
  

评论区

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