很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定义了N中状态,看的让人抓狂。该项目的大体逻辑是这样的,启动K个线程,当线程执行到某一个点时,进行轮训,判断是否所有线程都执行到该点,单独开启了一个线程用于轮训所有线程是否结束,待所有线程结束后会获取数据,生成一个文件,另外还有一个线程就在轮训文件是否生成,然后读取文件进行下一步操作。各种的轮训,显得非常的笨拙。利用boost库,我们来看看这么解决这些同步问题。

1、获取线程结果

boost::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果

unique_future 用于保存异步计算得到的结果

void GetFutures()
{
    boost::packaged_task<int> pt(boost::bind(Fibonacci, 10));
    boost::unique_future<int> uf = pt.get_future();
    //启动线程,必须使用move,packaged_task是不可拷贝的
    boost::thread th(boost::move(pt));
    uf.wait();
    int nVal = uf.get();
    cout << "Fibonacci " << nVal << endl;
}

uf.wait等待线程结束,当然future类也提供了很多种等待函数,如timed_wait等待一段时间。

当然,我们更多的时候是等待一组线程的结束,这是可以用wait_for_all等待所有future对象,wait_for_any 等待任意一个对象接收。

void GetFutures()
{
    boost::packaged_task<int> pt1(boost::bind(Fibonacci, 10));
    boost::packaged_task<int> pt2(boost::bind(Fibonacci, 20));
    boost::unique_future<int> uf1 = pt1.get_future();
    boost::unique_future<int> uf2 = pt2.get_future();
    boost::thread(boost::move(pt1));
    boost::thread(boost::move(pt2));
    boost::wait_for_all(uf1, uf2);
    cout << "Fibonacci " << uf1.get() << " ," << uf2.get() << endl;
}

2、护栏barrier

护栏就是说要等待所有的线程到达同一个点,才继续往下执行。

boost::barrier br(3);
void BarrierFunc()
{
    cout << "begin" << endl;
    br.wait();
    cout << "end " << endl;
}
void TestBarrier()
{
    boost::thread_group grp;
    grp.create_thread(BarrierFunc);
    grp.create_thread(BarrierFunc);
    grp.create_thread(BarrierFunc);
    grp.join_all();
}

3、线程本地存储

程序中使用全局变量或局部静态变量,这是非常常见的,但这样的函数对多线程程序来说,很难保证程序的正确性,这时我们希望,这些全局变量和局部静态变量,是线程独立拥有的,多个线程之间不会造成干扰,那么使用thread_specific_ptr就能轻松解决。

int Add(int n)
{
    static boost::thread_specific_ptr<int> sp;  //该变量是线程独立拥有的
    if (!sp.get())
    {
        sp.reset(new int(0));
    }
    *sp = n + *sp;
    return *sp;
}
void  Sum()
{
    cout <<  Add(5) + Add(10) << endl;           //得到的结果20
}
void ThreadSum()
{
    boost::thread_group threads;
    for (int i=0; i<5; ++i)
        threads.create_thread(&Sum);             //所有线程输出的结果是一样的
    threads.join_all();
}

(十二)boost库之多线程高级特性相关推荐

  1. (十)boost库之多线程

    1.创建线程 使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式: 线程库头文件:#include <bo ...

  2. 《Kotlin 程序设计》第十二章 Kotlin的多线程:协程(Coroutines)

    第十二章 Kotlin的多线程:协程(Coroutines) Kotlin 1.1 introduced coroutines, a new way of writing asynchronous, ...

  3. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  4. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  5. 【linux高级程序设计】(第十二章)Linux多线程编程 4

    读写锁 书上有读者写者的代码,我实在是懒得实现一遍了.跟之前的代码差不多. 多线程异步信号处理 int pthread_kill (pthread_t __threadid, int __signo) ...

  6. (十一)boost库之多线程间通信

    1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. # ...

  7. vue3 + vite + ts + setup , 第十二练 Vue3 css style 新特性,样式穿透,插槽选择器,全局选择器,在vue3中使用tailwindcss

    一.vue3.x 样式新特性 样式穿透  深度选择器 <style scoped> .a :deep(.b) {/* ... */ } </style> 插槽选择器 <s ...

  8. Python第十二章-多进程和多线程01-多进程

    多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...

  9. 【初阶与进阶C++详解】第二十二篇:C++11新特性(列表初始化+变量类型推到+右值引用+新增默认成员函数+可变模板参数+lambda表达式+包装器function_bind)

最新文章

  1. html 文档自动获取css,前端基础中css选择器,html文档 ,与javascrip中基本的获取
  2. 2018.09.14 codechef Milestone(随机化算法)
  3. 拒绝亡羊补牢!SQL Server服务器安全防护!
  4. Vue.js组件化开发实践
  5. MVC4下配置log4net 五部曲
  6. qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...
  7. python中保留一位小数要怎么编程_Python保留指定位数的小数
  8. Asp.Net MVC4入门指南(8):给数据模型添加校验器
  9. java类后面的尖括号_泛型 - Java中的T(尖括号)是什么意思?
  10. 点击箭头 切图 html,css写箭头
  11. Kafka代码连不上:Recovery is suppressed by NoRestartBackoffTimeStrategy
  12. 电脑太卡,重置电脑会解决问题吗
  13. PHPCAS客户端搭建教程
  14. 3D打印中常见的7中材质分析
  15. studio3t连接mysql_Studio 3T 2019 强大的MongoDB数据库连接工具
  16. 特斯拉Model 3设计缺陷导致底盘经常堆积厚厚泥沙
  17. 微信无感知检测单项好友【WeTool 免费版】【微信如何检测单向好友?】
  18. I/O端口的简单应用
  19. 格式工厂视频转换参数设置攻略
  20. [羊城杯 2020]login [SUCTF2019]hardcpp

热门文章

  1. request的其他细节
  2. 用户关联角色操作-代码实现
  3. shiro的会话管理:介绍
  4. SpringBoot高级-任务-异步任务
  5. 张红英模型matlab,京师微课 | 北京市特级教师张红英:化学学科核心素养培养课例...
  6. 我什么计算机作文600字,我家的电脑作文600字
  7. axios nodejs 上传图片_vue项目中使用axios上传图片等文件操作
  8. 200924阶段一C++STL
  9. 200723学习日报
  10. Get data from file(xxx.png) failed!