经典的线程池
来源:互联网 发布:甲醛无色无味 知乎 编辑:程序博客网 时间:2024/05/21 08:58
#include <iostream>#include <mutex>#include <future>#include <thread> #include <exception>#include <functional>#include <numeric>#include <limits>#include <queue>using namespace std;class CThreadPool{bool m_boolIsWorking = true;std::mutex m_mtxWorkQueueMtx;std::condition_variable m_cvWorkCv;std::queue<std::function<void()>> m_queWorkQue;std::vector<std::thread> m_vecThreadVec;void WorkThread(){while (m_boolIsWorking){std::unique_lock<std::mutex> lk(m_mtxWorkQueueMtx);m_cvWorkCv.wait(lk, [this]() {return false == m_boolIsWorking || false == m_queWorkQue.empty();});if (false == m_boolIsWorking)return;auto task = std::move(m_queWorkQue.front());m_queWorkQue.pop();try {task();}catch (...){}}}public:CThreadPool(){m_boolIsWorking = true;auto size = std::thread::hardware_concurrency();while (0 != size--)m_vecThreadVec.push_back(std::thread(&CThreadPool::WorkThread, this));}~CThreadPool() {m_boolIsWorking = false;std::unique_lock<std::mutex> lk(m_mtxWorkQueueMtx);m_cvWorkCv.notify_all();lk.unlock();for (auto & th : m_vecThreadVec)th.join();}void PutTask(std::function<void()> f){std::unique_lock<std::mutex> lk(m_mtxWorkQueueMtx);m_queWorkQue.push(std::move(f));m_cvWorkCv.notify_one();}};int main(){{CThreadPool pool;int a;while (cin >> a){if (0 == a)break;while (0 != a--){pool.PutTask([]() {std::this_thread::sleep_for(std::chrono::seconds(1));cout << ".";});}}}int pause;cin >> pause;}
0 0
- 经典的线程池
- Android线程池的经典使用
- 经典的线程协作例子
- 线程间的经典案例
- 操作系统 - 经典的线程模型
- 关于线程的经典解答
- 经典Java线程池的代码及各部分功能简介
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- Android研究院之应用开发线程池的经典使用
- 超经典的线程池文章 必看
- Android研究院之应用开发线程池的经典使用
- java concurrent 探秘(经典的线程个数,是否完成等的控制) 线程池
- android 通过URI获取文件名称Title
- SWI 软中断详解
- 同步、异步、阻塞和非阻塞的概念
- SQL Server建立基本数据表
- ora-19624 ora-19502 ora-27040
- 经典的线程池
- R语言笔记四
- 我的Java学习之路
- Grid View 网格视图——翻译自developer.android.com api guides
- libev 学习笔记之主体事件循环
- 2016-06-15-课程设计日志
- kali 私人笔记
- [Python]Merge Intervals
- WebView基本使用方法