CAFFE2中C++11实现的线程池

2023-12-19 18:48
文章标签 c++ 实现 线程 caffe2

本文主要是介绍CAFFE2中C++11实现的线程池,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据之前的总结,可以说用C++11的新特性设计一个线程池已经非常容易了,配合thread、mutex、condition_variable、lock、配以智能指针即安全又便捷,同时bind、functiond等搭配食用更佳。

caffe2是基于caffe的升级版,其中大量使用了C++的新特性,所以为了进一步熟悉这些新特性,不妨看看caffe2的一些实现。

#ifndef CAFFE2_UTILS_THREAD_POOL_H_
#define CAFFE2_UTILS_THREAD_POOL_H_#include <condition_variable>
#include <functional>
#include <mutex>
#include <queue>
#include <thread>class TaskThreadPool{private:std::queue< std::function< void() > > tasks_;//任务队列,function仿函数:
//function对象是对C++中现有的可调用实体的一种类型安全的包裹,包括函数,lambda表达式,函数指针等函数对象。std::vector<std::thread> threads_;//线程的容器---线程池std::mutex mutex_;std::condition_variable condition_;std::condition_variable completed_;bool running_;bool complete_;std::size_t available_;std::size_t total_;public:/// @brief Constructor.explicit TaskThreadPool(std::size_t pool_size):  threads_(pool_size), running_(true), complete_(true),available_(pool_size), total_(pool_size) {for ( std::size_t i = 0; i < pool_size; ++i ) {threads_[i] = std::thread(std::bind(&TaskThreadPool::main_loop, this));//绑定类的成员函数需要传入this指针}}/// @brief Destructor.~TaskThreadPool() {// Set running flag to false then notify all threads.{std::unique_lock< std::mutex > lock(mutex_);running_ = false;condition_.notify_all();}try {for (auto& t : threads_) {t.join();//对于容器中的每一个线程都等到他执行完毕,因为c++没有主动kill线程的机制}}// Suppress all exceptions.catch (const std::exception&) {}}//将可用的任务加入任务队列template <typename Task>void runTask(Task task) {std::unique_lock<std::mutex> lock(mutex_);// 任务队列有了任务,通知线程可以开始干活了tasks_.push(std::function<void()>(task));complete_ = false;condition_.notify_one();}/// @brief Wait for queue to be emptyvoid waitWorkComplete() {std::unique_lock<std::mutex> lock(mutex_);if (!complete_)completed_.wait(lock);}private://线程池入口void main_loop() {while (running_) {// 如果任务队列是空的,那就等着吧,直到队列中有task被pushstd::unique_lock<std::mutex> lock(mutex_);while (tasks_.empty() && running_) {condition_.wait(lock);}// 如果线程池不工作了,直接退出;if (!running_) break;{std::function< void() > task = tasks_.front();//从任务队列中弹出函数tasks_.pop();--available_;//相应地减少线程池中可用的线程个数lock.unlock();try {task();//线程执行任务}catch ( const std::exception& ) {}//再次获取锁lock.lock();//线程执行完毕,线程池内可用线程+1s++available_;if (tasks_.empty() && available_ == total_) {complete_ = true;completed_.notify_one();}}}  }
};#endif

这篇关于CAFFE2中C++11实现的线程池的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513308

相关文章

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.