日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/4/11 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (十二)boost库之多线程高级特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多時候,線程不僅僅是執行一些耗時操作,可能我們還需要得到線程的返回值,一般的處理方法就是定義一個全局狀態變量,不斷輪訓狀態,就如我目前維護的一個項目,全局變量定義了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(); }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。