c++线程池代码

创建一个简单的C++线程池涉及到多个方面,包括线程的创建、管理、任务的分配与执行等。下面是一个简化版的C++线程池实现,用于演示基本概念。这个例子使用了C++11标准中的线程库。

线程池类头文件(ThreadPool.h)cpp#ifndef THREADPOOL_H#define THREADPOOL_H#include <vector>#include <queue>#include <memory>#include <thread>#include <mutex>#include <condition_variable>#include <future>#include <functional>#include <stdexcept>class ThreadPool {public: ThreadPool(size_t); template<class F, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>; ~ThreadPool();private: // 需要跟踪的线程 std::vector< std::thread > workers; // 任务队列 std::queue< std::function<void()> > tasks; // 同步 std::mutex queue_mutex; std::condition_variable condition; bool stop;};#endif### 线程池类源文件(ThreadPool.cpp)cpp#include "ThreadPool.h"// 构造函数ThreadPool::ThreadPool(size_t threads) : stop(false){ for(size_t i = 0;i<threads;++i) workers.emplace_back( [this] { for(;;) { std::function<void()> task; { std::unique_lock<std::mutex> lock(this->queue_mutex); this->condition.wait(lock, [this]{ return this->stop || !this->tasks.empty(); }); if(this->stop && this->tasks.empty()) return; task = std::move(this->tasks.front()); this->tasks.pop(); } task(); } } );}// 添加新的工作项到线程池中template<class F, class... Args>auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>{ using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared< std::packaged_task<return_type()> >( std::bind(std::forward<F>(f), std::forward<Args>(args)...) ); std::future<return_type> res = task->get_future(); { std::unique_lock<std::mutex> lock(queue_mutex); // 不允许在停止的线程池中加入新的任务 if(stop) throw std::runtime_error("enqueue on stopped ThreadPool"); tasks.emplace([task](){ (*task)(); }); } condition.notify_one(); return res;}// 析构函数ThreadPool::~ThreadPool(){ { std::unique_lock<std::mutex> lock(queue_mutex); stop = true; } condition.notify_all(); for(std::thread &worker: workers) worker.join();}### 使用线程池cpp#include <iostream>#include "ThreadPool.h"int main(){ ThreadPool pool(4); std::vector< std::future<int> > results; for(int i = 0; i < 8; ++i) { results.emplace_back( pool.enqueue([i] { std::cout << "hello " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "world " << i << std::endl; return i*i; }) ); } for(auto && result: results) std::cout << result.get() << ' '; std::cout << std::endl; return 0;}这个简单的线程池实现展示了如何创建和使用线程池来执行任务。请注意,这个实现是为了演示目的而简化的。在生产环境中,你可能需要考虑更多的错误处理、线程池的动态调整、任务优先级等高级特性。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值