(十二)boost库之多线程高级特性
很多時候,線程不僅僅是執(zhí)行一些耗時操作,可能我們還需要得到線程的返回值,一般的處理方法就是定義一個全局狀態(tài)變量,不斷輪訓狀態(tài),就如我目前維護的一個項目,全局變量定義了N中狀態(tài),看的讓人抓狂。該項目的大體邏輯是這樣的,啟動K個線程,當線程執(zhí)行到某一個點時,進行輪訓,判斷是否所有線程都執(zhí)行到該點,單獨開啟了一個線程用于輪訓所有線程是否結(jié)束,待所有線程結(jié)束后會獲取數(shù)據(jù),生成一個文件,另外還有一個線程就在輪訓文件是否生成,然后讀取文件進行下一步操作。各種的輪訓,顯得非常的笨拙。利用boost庫,我們來看看這么解決這些同步問題。
1、獲取線程結(jié)果
??? boost::packaged_task 包裝一個可調(diào)用的對象,并且允許異步獲取該可調(diào)用對象產(chǎn)生的結(jié)果
??? unique_future 用于保存異步計算得到的結(jié)果
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等待線程結(jié)束,當然future類也提供了很多種等待函數(shù),如timed_wait等待一段時間。
當然,我們更多的時候是等待一組線程的結(jié)束,這是可以用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
護欄就是說要等待所有的線程到達同一個點,才繼續(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、線程本地存儲
程序中使用全局變量或局部靜態(tài)變量,這是非常常見的,但這樣的函數(shù)對多線程程序來說,很難保證程序的正確性,這時我們希望,這些全局變量和局部靜態(tài)變量,是線程獨立擁有的,多個線程之間不會造成干擾,那么使用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; //得到的結(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库之多线程高级特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十一)boost库之多线程间通信
- 下一篇: BOOST内存管理(一) --- boo