thread_group是boost库中的线程池类,内部使用的是boost::thread。

随着C++ 11标准的制定和各大编译器的新版本的推出(其实主要是VS2012的推出啦……),本着能用标准库就用标准库的指导原则,决定把项目中多线程相关的部分代码从boost::thread迁移到std::thread。

thread的迁移本身很简单,毕竟stl的很多功能是直接从boost发展而来的,基本上就是改一下头文件和名称空间的问题,例外是thread_group,thread_group是boost的组件,但并不是标准库的组件,所以需要自己实现一下。

说是自己实现,其实就是复制粘贴boost中的代码啦。但boost中的thread_group使用shared_mutex来进行线程同步,shared_mutex也没有进入标准库,所以需要用什么东西来替代一下。shared_mutex没能进入标准库的原因就是C++标准化委员会认为目前可行的shared_mutex实现方案在性能上并不合算,不如直接使用mutex,既然如此,就直接用mutex吧。相应的shared_lock也修改成lock_guard,完成。

#include <thread>
#include <mutex>
#include <list>#include <memory>namespace std
{//兼容boost::thread_group//使用std::thread代替boost::thread,std::mutex代替boost::shared_mutexclass thread_group{private:thread_group(thread_group const&);thread_group& operator=(thread_group const&);        public:thread_group() {}~thread_group(){for(auto it=threads.begin(),end=threads.end();    it!=end;++it){delete *it;}}template<typename F>thread* create_thread(F threadfunc){lock_guard<mutex> guard(m);auto_ptr<thread> new_thread(new thread(threadfunc));threads.push_back(new_thread.get());return new_thread.release();}void add_thread(thread* thrd){if(thrd){lock_guard<mutex> guard(m);threads.push_back(thrd);}}void remove_thread(thread* thrd){lock_guard<mutex> guard(m);auto it=std::find(threads.begin(),threads.end(),thrd);if(it!=threads.end()){threads.erase(it);}}void join_all(){lock_guard<mutex> guard(m);for(auto it=threads.begin(),end=threads.end();it!=end;++it){(*it)->join();}}size_t size() const{lock_guard<mutex> guard(m);return threads.size();}private:list<thread*> threads;mutable mutex m;};
}

——其实完全没意义嘛……

转载于:https://www.cnblogs.com/lvdongjie/p/4487779.html

用std::thread替换实现boost::thread_group相关推荐

  1. boost::thread_group相关的测试程序

    boost::thread_group相关的测试程序 实现功能 C++实现代码 实现功能 boost::thread_group相关的测试程序 C++实现代码 #include <boost/t ...

  2. ‘std::thread‘ has not been declared

    出现这个问题的原因就是 目前MinGW GCC64还不支持std::thread 这是我的gcc版本 PS D:\MyCode> gcc --version gcc.exe (x86_64-wi ...

  3. std::thread使用

    c++ 11 之后有了标准的线程库:std::thread.通过c++11中的线程库创建线程,极为方便,且跨平台,是语言层面的.之前跨平台的多线程开发中,多使用boost 相关第三方库. 1.std: ...

  4. C++11 新特性之std::thread

    C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...

  5. std thread

    不要用std::thread写裸线程 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/daan_112211/article/details/1908 ...

  6. 并发,std::thread

    2019独角兽企业重金招聘Python工程师标准>>> std::thread  定义一个线程对象,并管理关联的线程 备注: 你可以使用 thread 对象来观察和管理在应用程序中的 ...

  7. 【多线程】C++11进行多线程开发 (std::thread)

    文章目录 创建线程 std::thread 类 使用join() 使用 detach() 警惕作用域 线程不能复制 给线程传参 传递指针 传递引用 以类成员函数为线程函数 以容器存放线程对象 互斥量 ...

  8. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  9. C++ std::thread 和 std::jthread 使用详解 (含C++20新特性)

    目录 std::thread std::thread 构造函数 观察器 操作 std::jthread std::jthread 构造函数 观察器 操作 停止记号处理 管理当前线程的函数 yield( ...

最新文章

  1. Intro to Parallel Programming CUDA-第一单元
  2. SpringCloud中Hystrix容错保护原理及配置,看它就够了!
  3. Linux下的mysql设置表不区分大小写
  4. 万字谈监控:解答Zabbix与Prometheus选型疑难
  5. python有什么功能-Python 3.9有什么新功能?
  6. 【手势交互】9. PS Move
  7. 1008: University
  8. 计算机本地磁盘D无法扩展,计算机上的本地磁盘D突然无法打开,表明它需要格式化...
  9. PHP 加密用户密码 How to store passwords safely with PHP and MySQL
  10. linux输出文件没有找到,Linux环境下标准输入、输出、错误信息详解
  11. hive报错(1)MoveTask
  12. 增量式速度pid调节策略_增量式PID是什么?不知道你就落伍了
  13. Kafka Producer生产者原理
  14. OsgEarth加载shp文件问题以及shp文件介绍
  15. 适合小白使用的python编辑器_5个适合小白的Python开发必备工具(推荐)
  16. c语言黑底图片,用c语言把bmp格式的彩色图片转换成黑白的
  17. 大数据小项目之电视收视率企业项目09--hive环境搭建
  18. 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以单个空格符隔开,为简单起见,不带标点符号。 例如输入“I am a student”,则通过控制台输出“student a
  19. Python--面向对象进阶
  20. VB实现excel自动拆分表格

热门文章

  1. freemarker空格问题
  2. org.apache.ibatis.builder.BuilderException: An invalid property ‘jdbcType ‘ was found in mapping
  3. a标签加onclick点击事件
  4. erlang 变量存储在哪里_erlang中变量作用域
  5. ACM-ICPC常用模板更新
  6. 电气装置安装工程接地装置施工及验收规范_(册说明)电气设备安装工程
  7. JavaScript的Array对象使用(1)
  8. solving order
  9. linux断网后自动重连,centos 空闲一段时间后自动断网
  10. 代码块_Dynamo?Get 7.1 什么是代码块