(十二)boost库之多线程高级特性
很多時(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十一)boost库之多线程间通信
- 下一篇: BOOST内存管理(一) --- boo