C++—线程池
1. Boost.Asio 线程池
下载:https://sourceforge.net/proje...
VS 中使用:项目 - 属性 - VC目录 - 包含目录,添加 YourPath\asio-1.18.2\include
官方文档:https://www.boost.org/doc/lib...
#include
#include
#include using namespace std::literals;
static std::atomic_uint32_t count = 0;
int main()
{
// 两个线程
asio::thread_pool pool(2);
auto work = []()
{
std::this_thread::sleep_for(1ns);
count++;
};
int n = 1000;
for (int i = 0;
i < n;
i++)
{
// 提交任务
asio::post(pool, work);
}// 等待所有线程执行完成
pool.join();
std::cout << "count = " << count << '\n';
}
count = 1000
其他操作:
void stop();
如果可以的话,立马终止线程,还未被执行的任务可能将不会被执行.
2. 自定义线程池实现
实现思路:
- 维护一个任务队列,其中保存用户提交的任务;
- 创建一个线程集合,然后令每个线程去轮询任务队列,从任务队列中提取任务并执行.
#ifndef THREADPOOL_H
#define THREADPOOL_H#include
#include
#include
#include
#include
#include
#include using Task = std::function;
class ThreadPool
{
public:
ThreadPool(int nThreads = 1);
~ThreadPool();
// 提交任务
bool submitTask(const Task& task);
bool submitTask(Task&& task);
// 等待线程执行完毕
void join();
private:
void runTasks();
private:
std::vector m_threads;
// 工作者线程集合
std::list m_taskQueue;
// 任务队列
std::atomic m_exit;
// 是否要退出
std::mutex m_taskQueueMutex;
std::condition_variable m_taskQueueNotEmpty;
};
#endif
ThreadPool.cpp:
ThreadPool::ThreadPool(int nThreads) : m_exit(false)
{
m_threads.reserve(nThreads);
for (int i = 0;
i < nThreads;
i++)
{
m_threads.emplace_back(std::move(std::thread(&ThreadPool::runTasks, this)));
}
}ThreadPool::~ThreadPool()
{
join();
}bool ThreadPool::submitTask(const Task& task)
{
std::lock_guard qLock(m_taskQueueMutex);
if (m_taskQueue.size() == m_taskQueue.max_size())
{
return false;
}m_taskQueue.push_back(task);
m_taskQueueNotEmpty.notify_one();
return true;
}bool ThreadPool::submitTask(Task&& task)
{
std::lock_guard qLock(m_taskQueueMutex);
if (m_taskQueue.size() == m_taskQueue.max_size())
{
return false;
}m_taskQueue.emplace_back(std::move(task));
m_taskQueueNotEmpty.notify_one();
return true;
}void ThreadPool::join()
{
m_exit.store(true);
m_taskQueueNotEmpty.notify_all();
for (auto&& t : m_threads)
{
t.join();
}m_threads.clear();
}void ThreadPool::runTasks()
{
Task task;
while (true)
{
std::unique_lock qLock(m_taskQueueMutex);
while (m_taskQueue.empty() && !m_exit)
{
m_taskQueueNotEmpty.wait(qLock);
}if (m_taskQueue.empty())
{
return;
}task = m_taskQueue.front();
m_taskQueue.pop_front();
qLock.unlock();
task();
}
}
【C++—线程池】主程序:
#include
#include
#include "ThreadPool.h"using namespace std::literals;
static std::atomic_uint32_t count = 0;
int main()
{
ThreadPool pool(2);
int n = 1000;
for (int i = 0;
i < n;
i++)
{
pool.submitTask([]()
{
std::this_thread::sleep_for(1ns);
count++;
});
}pool.join();
std::cout << "count = " << count << '\n';
}
count = 1000
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术