boost库多线程特性
来源:互联网 发布:萨尔浒之战 知乎 编辑:程序博客网 时间:2024/06/03 06:42
很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,
不断轮训状态,就如我目前维护的一个项目,全局变量定义了N中状态,看的让人抓狂。该项目的大体逻辑是这样的,启动K个线程,
当线程执行到某一个点时,进行轮训,判断是否所有线程都执行到该点,单独开启了一个线程用于轮训所有线程是否结束,
待所有线程结束后会获取数据,生成一个文件,另外还有一个线程就在轮训文件是否生成,然后读取文件进行下一步操作。各种的轮训,显得非常的笨拙。
不断轮训状态,就如我目前维护的一个项目,全局变量定义了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();}
1 0
- boost库多线程特性
- boost多线程库使用指南
- boost多线程库使用指南
- boost多线程库使用指南
- Boost库多线程
- Boost 库多线程编程一
- Boost 库多线程编程二
- Boost 库多线程编程三
- Boost 库多线程编程四
- boost 多线程
- boost多线程
- Boost多线程
- boost 多线程
- boost多线程
- BOOST多线程
- boost 多线程
- 【Boost】boost库中thread多线程详解1
- 【Boost系列】boost库中thread多线程详解1
- 设计模式 精华一页纸
- JavaScript基础
- remove needs a query at src/mongo/shell/collection.js:299
- Tab标签页(面试常考)分别用原生js和jquery实现
- YUYV编码成h.264:Linux视频采集与编码(二)
- boost库多线程特性
- 光棍节程序员闯关秀 writeup
- 【ssm个人博客项目实战01】SSM环境搭建
- fortran动态结构体数组的实现
- 阿里云虚拟主机连接MySQL报错 bdm267037493_db.tablename donot exist
- perror 和 strerror 区别
- 《TCP/IP详解卷一:协议》学习笔记六
- 【算法题之路】从尾到头打印链表
- 使用lite-server快速搭建本地服务器