日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(十二)boost库之多线程高级特性

發(fā)布時(shí)間:2024/4/11 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (十二)boost库之多线程高级特性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

很多時(shí)候,線程不僅僅是執(zhí)行一些耗時(shí)操作,可能我們還需要得到線程的返回值,一般的處理方法就是定義一個(gè)全局狀態(tài)變量,不斷輪訓(xùn)狀態(tài),就如我目前維護(hù)的一個(gè)項(xiàng)目,全局變量定義了N中狀態(tài),看的讓人抓狂。該項(xiàng)目的大體邏輯是這樣的,啟動(dòng)K個(gè)線程,當(dāng)線程執(zhí)行到某一個(gè)點(diǎn)時(shí),進(jìn)行輪訓(xùn),判斷是否所有線程都執(zhí)行到該點(diǎn),單獨(dú)開啟了一個(gè)線程用于輪訓(xùn)所有線程是否結(jié)束,待所有線程結(jié)束后會(huì)獲取數(shù)據(jù),生成一個(gè)文件,另外還有一個(gè)線程就在輪訓(xùn)文件是否生成,然后讀取文件進(jìn)行下一步操作。各種的輪訓(xùn),顯得非常的笨拙。利用boost庫,我們來看看這么解決這些同步問題。

1、獲取線程結(jié)果

??? boost::packaged_task 包裝一個(gè)可調(diào)用的對(duì)象,并且允許異步獲取該可調(diào)用對(duì)象產(chǎn)生的結(jié)果

??? unique_future 用于保存異步計(jì)算得到的結(jié)果

void GetFutures() { boost::packaged_task<int> pt(boost::bind(Fibonacci, 10)); boost::unique_future<int> uf = pt.get_future(); //啟動(dòng)線程,必須使用move,packaged_task是不可拷貝的 boost::thread th(boost::move(pt)); uf.wait(); int nVal = uf.get(); cout << "Fibonacci " << nVal << endl; }

uf.wait等待線程結(jié)束,當(dāng)然future類也提供了很多種等待函數(shù),如timed_wait等待一段時(shí)間。

當(dāng)然,我們更多的時(shí)候是等待一組線程的結(jié)束,這是可以用wait_for_all等待所有future對(duì)象,wait_for_any 等待任意一個(gè)對(duì)象接收。

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、護(hù)欄barrier

護(hù)欄就是說要等待所有的線程到達(dá)同一個(gè)點(diǎn),才繼續(xù)往下執(zhí)行。

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、線程本地存儲(chǔ)

程序中使用全局變量或局部靜態(tài)變量,這是非常常見的,但這樣的函數(shù)對(duì)多線程程序來說,很難保證程序的正確性,這時(shí)我們希望,這些全局變量和局部靜態(tài)變量,是線程獨(dú)立擁有的,多個(gè)線程之間不會(huì)造成干擾,那么使用thread_specific_ptr就能輕松解決。

int Add(int n) { static boost::thread_specific_ptr<int> sp; //該變量是線程獨(dú)立擁有的 if (!sp.get()) { sp.reset(new int(0)); } *sp = n + *sp; return *sp; } void Sum() { cout << Add(5) + Add(10) << endl; //得到的結(jié)果20 } void ThreadSum() { boost::thread_group threads; for (int i=0; i<5; ++i) threads.create_thread(&Sum); //所有線程輸出的結(jié)果是一樣的 threads.join_all(); }

總結(jié)

以上是生活随笔為你收集整理的(十二)boost库之多线程高级特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。