一个模板线程池

一个模板线程池

下载源代码

一个模板线程池,没有使用信号灯,互斥体等同步对象。

主要思路是初始化一个管理线程,管理线程通过消息协调任务链表和工作线程之间如何更好的工作,消息通信使用PostThreadMessage。

下面是模板线程池源代码

下面介绍如何使用这个模板线程池

1.任务类和模板实例化线程池类的定义及其实现

 

实现代码很简单,下面是线程池任务处理过程

 

2. 在对话框中实例化这个线程池类,并使用

a.添加头文件,本例中是

b.实例化这个线程池类,本例中是添加到类成员变量中

c.初始化线程池对象

注:默认是初始化10个工作线程,你也可以在有空闲线程的时候调用SetThreadNum设置工作线程个数.

d.添加任务到线程池对象中

 

在VC6.0中可能会有内存泄露(大小:工作线程个数*sizeof(任务类)),在VS2008SP1中测试没有内存泄露.

需要在各个VS版本测试,请修改模板线程池的析构函数的_MSC_VER宏为对应的VS版本即可.

 

 

在 C++ 中,创建一个线程池可以帮助管理一组并发任务,避免频繁地创建和销毁新线程,提高性能和资源利用率。下面是一个简单的线程池实现示例,使用了 `<thread>` 和 `std::queue`: ```cpp #include <iostream> #include <queue> #include <vector> #include <thread> #include <mutex> class ThreadPool { public: ThreadPool(size_t num_threads) : stop(false), threads(num_threads) { for (size_t i = 0; i < num_threads; ++i) { workers.emplace_back([this] { while (!stop) { processTask(); } }); } } ~ThreadPool() { stop = true; joinAllThreads(); } template<typename Func, typename... Args> void enqueue(Func&& func, Args&&... args) { std::lock_guard<std::mutex> lock(queue_mutex); tasks.push(std::make_tuple(func, std::forward<Args>(args)...)); } private: void processTask() { if (!tasks.empty()) { auto task = tasks.front(); tasks.pop(); executeTask(std::move(task)); } else { this_thread::yield(); // 防止 CPU 过度切换 } } void executeTask(std::tuple<Func, Args...>&& task) { try { std::apply(std::ref(callback), std::move(task)); } catch (...) { std::cerr << "Error executing task!" << std::endl; } } void joinAllThreads() { for (auto& worker : workers) { worker.join(); } } bool stop; std::queue<std::tuple<Func, Args...>> tasks; std::vector<std::thread> workers; mutable std::mutex queue_mutex; std::function<void(Func, Args...)>& callback = [](Func f, Args... a) { f(a...); }; // 临时函数用于保存任务 }; int main() { ThreadPool pool(4); for (int i = 0; i < 10; ++i) { pool.enqueue([](int n) { std::cout << "Task " << n << " running on thread " << std::this_thread::get_id() << '\n'; }, i); } pool.joinAllThreads(); return 0; } ``` 这个简单线程池的主要部分包括线程列表、一个队列用于存放待处理的任务,以及一个函数模板用于封装用户提供的回调函数。当用户提交任务时,它会添加到队列,然后唤醒并运行一个空闲的线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值