博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库多线程特性
阅读量:3589 次
发布时间:2019-05-20

本文共 2033 字,大约阅读时间需要 6 分钟。

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

  利用boost库,我们来看看这么解决这些同步问题。

//1、获取线程结果    //boost::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果    //unique_future 用于保存异步计算得到的结果	void GetFutures()	{		boost::packaged_task
pt(boost::bind(Fibonacci, 10)); boost::unique_future
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
pt1(boost::bind(Fibonacci, 10)); boost::packaged_task
pt2(boost::bind(Fibonacci, 20)); boost::unique_future
uf1 = pt1.get_future(); boost::unique_future
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
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(); }

转载地址:http://niown.baihongyu.com/

你可能感兴趣的文章
python中pandas检索某一个具体值(具体到一个元素)
查看>>
pandas选取指定列
查看>>
pandas打开csv和excel
查看>>
pandas中dataframe类型操作方法大全
查看>>
pandas删除指定列中有空值的行
查看>>
pandas中字符串替换
查看>>
车辆转弯角度算法,代码
查看>>
python实现灰度图像转换
查看>>
python实现手绘效果
查看>>
windows下pip镜像源换成清华镜像
查看>>
python pip命令下载不了解决办法,python特殊包的下载
查看>>
Chrome正在受到自动软件的控制 解决办法
查看>>
selenium定位的使用
查看>>
selenium定位的实例
查看>>
html文档为uincode编码的解码问题
查看>>
urllib.request.urlretrieve
查看>>
python文本相似度分析tf-idf
查看>>
sklearn无监督学习-聚类k-means
查看>>
树莓派中文输入法
查看>>
sklearn-降维-(主成分分析)PCA
查看>>