青海网站建设费用,网络技术服务合同模板,网站建设品牌推广seo,网站开发费是无形资产吗纯C风格线程池
纯C 风格线程池可参考这篇文章
https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2c2IJUcCUOfzEQQRRdOXYIZuCjP
视频教程
相关线程池和并发编程的视频可以看看这个连接#xff1a;
https://www.bilibili.com/video/BV1Xt421H7M7/?vd_s…纯C风格线程池
纯C 风格线程池可参考这篇文章
https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2c2IJUcCUOfzEQQRRdOXYIZuCjP
视频教程
相关线程池和并发编程的视频可以看看这个连接
https://www.bilibili.com/video/BV1Xt421H7M7/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9
支持信号机制的线程池
我的项目中期待封装一个类内部有个线程池处理外部投递的内容这个类同时支持对外发送信号等同时这个类是一个单例类那么这个类可以继承QOjbject支持信号机制并且其内部可以封装一个线程池响应外部投递的任务结合纯C版本封装了如下在QT环境使用的线程池目前已经投入到生产中。
用到的头文件
#include QObject
#include queue
#include vector
#include thread
#include queue
#include memory
#include functional
#include mutex
#include atomic
#include future头文件编写
#ifndef SEQSCHEDULER_H
#define SEQSCHEDULER_H
//wwc 处理维护关机流程清洗等时序执行的类
class SeqScheduler: public QObject
{Q_OBJECT
public:~ SeqScheduler();static SeqScheduler Inst();templatetypename F, typename ... Argsauto CommitTask(F func, Args ... args) -std::futuredecltype(std::forwardF(func)(std::forwardArgs(args)...)) {using RetType decltype(std::forwardF(func)(std::forwardArgs(args)...));if (_b_stop.load()) {return std::futureRetType{};}auto bind_func std::bind(std::forwardF(func), std::forwardArgs(args)...);auto pack_task std::make_sharedstd::packaged_taskRetType(void)(bind_func);auto future pack_task-get_future();{std::lock_guardstd::mutex lock(_work_mtx);_work_que.push([pack_task]() {(*pack_task)();});}_work_con.notify_one();return future;}private: SeqScheduler(const SeqScheduler) delete;SeqScheduler operator (const SeqScheduler) delete;SeqScheduler(unsigned int num std::thread::hardware_concurrency());std::queuestd::functionvoid(void) _work_que;std::mutex _work_mtx;std::condition_variable _work_con;std::atomicbool _b_stop;std::vectorstd::thread _pool;std::atomic_int _thread_num;
};#endif // SEQSCHEDULER_H类的具体实现
#include seqscheduler.hSeqScheduler::SeqScheduler(unsigned int num ): _b_stop(false)
{if (num 1)_thread_num 1;else_thread_num num;for (int i 0; i _thread_num; i) {_pool.emplace_back([this]() {for (; !(_b_stop.load());) {std::unique_lockstd::mutex unique_locker(_work_mtx);_work_con.wait(unique_locker, [this]() {if (_b_stop.load()) {return true;}if (_work_que.empty()) {return false;}return true;});if (_b_stop.load()) {return;}//出队auto task _work_que.front();_work_que.pop();unique_locker.unlock();task();}});}}SeqScheduler SeqScheduler::Inst()
{static SeqScheduler inst;return inst;
}SeqScheduler::~SeqScheduler(){_b_stop true;{std::unique_lockstd::mutex unique_locker(_work_mtx);_work_con.notify_all();}for (auto td : _pool) {if (td.joinable()) {std::cout join thread td.get_id() std::endl;td.join();}}
}
使用线程池
线程池的使用可以通过如下方式投递任务任务在后台自动执行
void Test(){SeqScheduler::Inst().CommitTask([]() {asyncLog(slot machine perfusion called );});
}如需等待任务完成可以用wait或者get
void Test(){auto task_future SeqScheduler::Inst().CommitTask([]() {asyncLog(slot machine perfusion called );});task_future.wait();
}