C++ 线程池

#include <iostream>
#include <thread>
#include <mutex>
#include <string>
#include <condition_variable>
#include <queue>
#include <vector>
#include <functional>
// 1:访问全局变量必须加锁
// 2:
class ThreadPool {
public:
	ThreadPool(int thread_number)
		:is_exit_(false)
	{
		for (int i = 0; i < thread_number; i++)
		{
			thread_pools_.emplace_back([this]() {
				while (true){
					std::unique_lock<std::mutex> lock(mtx_); 
					condition_variable_.wait(lock, [this]() {
						return !all_tasks_.empty() || is_exit_;  //!< 当有任务时,返回true不等待 ,退出 true 直接不等待
						});

					if (is_exit_ && all_tasks_.empty()) {
						return;
					}
					auto task = all_tasks_.front();
					all_tasks_.pop();
					lock.unlock();
					task();
				}
				});
		}
	}
	// 尽量使用C++新特性
	template<class Func,class ...Args> //!< F是函数指针,  Args是参数
	void AddTask(Func&& func, Args&&... args) {
		std::function<void()> task = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
		{
			std::unique_lock<std::mutex> lock(mtx_);
			all_tasks_.emplace(move(task));
		}
		condition_variable_.notify_one();  //!< 任务队列对应线程池。
	}

	~ThreadPool() {
		{
			std::unique_lock<std::mutex> lock(mtx_);
			is_exit_ = true;
		}
		condition_variable_.notify_all();  //!< 线程结束通知所有线程
		for (int i = 0; i < thread_pools_.size(); i++)
		{
			thread_pools_[i].join(); //!< main函数join
		}	
	}

private:
	bool is_exit_;
	std::mutex mtx_;
	std::condition_variable condition_variable_;
	std::vector<std::thread> thread_pools_;
	std::queue<std::function<void()>> all_tasks_;
};

int main() {
	ThreadPool thread_pool(5);
	for (int i = 0; i < 10; i++)
	{
		thread_pool.AddTask([i]() {
			std::cout << i << " begin" <<  std::endl;
			std::this_thread::sleep_for(std::chrono::seconds(1));
			std::cout << i << " end" << std::endl;
			});
	}
	getchar();
	return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++线程池可以用来处理一些需要并发执行的任务,同时避免频繁创建和销毁线程所带来的开销。下面是一个简单的C++线程池实现: ```cpp #include <iostream> #include <queue> #include <thread> #include <mutex> #include <condition_variable> class ThreadPool { public: ThreadPool(size_t num_threads) { for (size_t i = 0; i < num_threads; ++i) { threads_.emplace_back([this] { while (true) { Task task; { std::unique_lock<std::mutex> lock(mutex_); cond_.wait(lock, [this] { return !tasks_.empty() || stop_; }); if (stop_ && tasks_.empty()) return; task = std::move(tasks_.front()); tasks_.pop(); } task(); } }); } } ~ThreadPool() { { std::unique_lock<std::mutex> lock(mutex_); stop_ = true; } cond_.notify_all(); for (auto& thread : threads_) { thread.join(); } } template <typename Func, typename... Args> void AddTask(Func&& func, Args&&... args) { auto task = std::bind(std::forward<Func>(func), std::forward<Args>(args)...); { std::unique_lock<std::mutex> lock(mutex_); tasks_.emplace(std::move(task)); } cond_.notify_one(); } private: using Task = std::function<void()>; std::vector<std::thread> threads_; std::queue<Task> tasks_; std::mutex mutex_; std::condition_variable cond_; bool stop_ = false; }; ``` 这个实现定义了一个ThreadPool类,构造函数中创建了指定数量的线程,并且每个线程都会从任务队列中获取任务并执行;析构函数中会通知所有线程停止执行,并等待所有线程退出;AddTask方法用于添加一个任务到任务队列中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值