锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源 / C++17标准实现线程池ThreadPool短小精悍实用性强
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容


C++17标准实现线程池ThreadPool短小精悍实用性强


近期使用httplib,研究了httplib的源代码,里面的线程池TreadPool用C++17标准实现,短小精悍实用性强,把std::mutex、condition_variable、function、thread和lambda函数体有机结合使用,用极少的代码实现了安全可靠的线程池ThreadPool,推荐给大家共同提高。

线程池代码:

        //基类,线程常用任务
class TaskQueue {
public:
TaskQueue() = default;
virtual ~TaskQueue() = default;

virtual bool enqueue(std::function<void()> fn) = 0;
virtual void shutdown() = 0;

virtual void on_idle() {}
};

class ThreadPool final : public TaskQueue {
public:
explicit ThreadPool(size_t n, size_t mqr = 0)
: shutdown_(false), max_queued_requests_(mqr) {
while (n) {
threads_.emplace_back(worker(*this));//初始化线程,worker结构体对象的默认函数是线程函数
n--;
}
}

ThreadPool(const ThreadPool &) = delete;
~ThreadPool() override = default;

bool enqueue(std::function<void()> fn) override {
{
std::unique_lock<std::mutex> lock(mutex_);
if (max_queued_requests_ > 0 && jobs_.size() >= max_queued_requests_) {
return false;
}
jobs_.push_back(std::move(fn));//添加队列
}

cond_.notify_one();//通知消息
return true;
}

void shutdown() override {
// Stop all worker threads...
{
std::unique_lock<std::mutex> lock(mutex_);
shutdown_ = true;
}

cond_.notify_all();//关闭时通知所有

// Join...
for (auto &t : threads_) {
t.join();
}
}

private:
struct worker {
explicit worker(ThreadPool &pool) : pool_(pool) {}

void operator()() {
for (;;) {
std::function<void()> fn;
{
std::unique_lock<std::mutex> lock(pool_.mutex_);//保证线程互斥,资源安全
//等待信号
pool_.cond_.wait(
lock, [&] { return !pool_.jobs_.empty() || pool_.shutdown_; });
//不满足条件退出
if (pool_.shutdown_ && pool_.jobs_.empty()) { break; }

fn = pool_.jobs_.front();
pool_.jobs_.pop_front();
}

assert(true == static_cast<bool>(fn));
fn();
}

#if defined(CPPHTTPLIB_OPENSSL_SUPPORT) && !defined(OPENSSL_IS_BORINGSSL)
OPENSSL_thread_stop();
#endif
}

ThreadPool &pool_;
};
friend struct worker;

std::vector<std::thread> threads_;
std::list<std::function<void()>> jobs_;

bool shutdown_;
size_t max_queued_requests_ = 0;

std::condition_variable cond_;
std::mutex mutex_;
};

调用代码:

 //this,sock是引导区给lambda函数体的参数
if (!task_queue->enqueue(
[this, sock]() { process_and_close_socket(sock); })) {
detail::shutdown_socket(sock);
detail::close_socket(sock);
}
友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近