C++11獲取線(xiàn)程返回值的實(shí)現(xiàn)代碼
C++11 std::future and std::promise
在許多時(shí)候,我們會(huì)有這樣的需求——即我們想要得到線(xiàn)程返回的值。
但是在C++11 多線(xiàn)程中我們注意到,std::thread對(duì)象會(huì)忽略頂層函數(shù)的返回值。
那問(wèn)題來(lái)了,我們要怎么獲得線(xiàn)程的返回值呢?
我們通過(guò)一個(gè)例子來(lái)說(shuō)明如何實(shí)現(xiàn)這個(gè)需求。
假設(shè)我們的app會(huì)創(chuàng)建一個(gè)線(xiàn)程來(lái)壓縮一個(gè)文件夾,該線(xiàn)程在壓縮完文件夾后會(huì)返回壓縮文件 *.zip 和這個(gè)zip文件的大小,我們現(xiàn)在就想獲得這個(gè)線(xiàn)程的返回值。
有兩種方法可以實(shí)現(xiàn)這個(gè)需求:
1. 傳統(tǒng)的方法:在線(xiàn)程間共享指針
傳遞一個(gè)指針給壓縮文件的線(xiàn)程,表示壓縮文件的線(xiàn)程將會(huì)把值寫(xiě)入指針指向的內(nèi)存空間。此時(shí)主線(xiàn)程將用條件變量等待值被寫(xiě)入,當(dāng)壓縮文件線(xiàn)程把值寫(xiě)入指針指定的內(nèi)存后,將喚醒(signal)條件變量,然后主線(xiàn)程將被喚醒,然后從指針指向的內(nèi)存中獲取返回值。
為了實(shí)現(xiàn)獲取一個(gè)返回值的需求,使用傳統(tǒng)的方法,我們需要條件變量(condition variable), 互斥量(mutex),和指針三個(gè)對(duì)象。
如果假設(shè),我們需要獲得壓縮線(xiàn)程里三個(gè)返回值,情況會(huì)變得更加復(fù)雜。
那std::future就是來(lái)簡(jiǎn)化這個(gè)編程過(guò)程的
2. C++11的方法:使用std::future和std::promise
人如其名,std::future
和std::promise
對(duì)象就和他們的名字一樣。這兩個(gè)類(lèi)在獲取程序返回值的時(shí)候需要配合使用
std::future,是一個(gè)類(lèi)模板,它存儲(chǔ)著一個(gè)未來(lái)的值。
那問(wèn)題來(lái)了,未來(lái)的值是什么鬼?
實(shí)際上一個(gè)std::future對(duì)象里存儲(chǔ)著一個(gè)在未來(lái)會(huì)被賦值的變量,這個(gè)變量可以通過(guò)std::future提供的成員函數(shù)std::future::get()來(lái)得到。如果在這個(gè)變量被賦值之前就有別的線(xiàn)程試圖通過(guò)std::future::get()獲取這個(gè)變量,那么這個(gè)線(xiàn)程將會(huì)被阻塞到這個(gè)變量可以獲取為止。
std::promise
同樣也是一個(gè)類(lèi)模板,它的對(duì)象承諾會(huì)在未來(lái)設(shè)置變量(這個(gè)變量也就是std::future中的變量)。每一個(gè)std::promise對(duì)象都有一個(gè)與之關(guān)聯(lián)的std::future對(duì)象。當(dāng)std::promise設(shè)置值的時(shí)候,這個(gè)值就會(huì)賦給std::future中的對(duì)象了。
我們一步一步來(lái)看一下如何做
在主線(xiàn)程中創(chuàng)建std::promise對(duì)象
std::promise<int> promiseObj;
上面定義的promise對(duì)象還沒(méi)有任何關(guān)聯(lián)的值。但是它承諾某個(gè)線(xiàn)程將會(huì)設(shè)置與其關(guān)聯(lián)的值,并且,當(dāng)值被設(shè)置以后,可以通過(guò)與promise關(guān)聯(lián)的std::future對(duì)象來(lái)獲取該值。
假設(shè)我們的主線(xiàn)程將創(chuàng)建的std::promise對(duì)象傳遞給了壓縮線(xiàn)程,那主線(xiàn)程要怎么知道壓縮線(xiàn)程已經(jīng)設(shè)置好了值呢?
答案就是使用 std::future對(duì)象
// main thread std::future<int> futureObj = promiseObj.get_future(); int val = futureObj.get(); // compression thread promiseObj.set_value(45);
在compression thread未執(zhí)行set_value()時(shí),如果主線(xiàn)程調(diào)用了futureObj.get(),那么主線(xiàn)程將會(huì)被阻塞。
看整個(gè)時(shí)序圖:
最終代碼
#include<iostream> //std::cout std::endl #include<thread> //std::thread #include<future> //std::future std::promise #include<utility> //std::ref #include<chrono> //std::chrono::seconds void initiazer(std::promise<int> &promiseObj){ std::cout << "Inside thread: " << std::this_thread::get_id() << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); promiseObj.set_value(35); } int main(){ std::promise<int> promiseObj; std::future<int> futureObj = promiseObj.get_future(); std::thread th(initiazer, std::ref(promiseObj)); std::cout << futureObj.get() << std::endl; th.join(); return 0; }
本文參考于C++11 Multithreading – Part 8: std::future , std::promise and Returning values from Thread,并做了適當(dāng)修改
上一篇:c++編程學(xué)習(xí)的技巧總結(jié)
欄 目:C語(yǔ)言
本文標(biāo)題:C++11獲取線(xiàn)程返回值的實(shí)現(xiàn)代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/374.html
您可能感興趣的文章
- 01-10Linux線(xiàn)程管理必備:解析互斥量與條件變量的詳解
- 01-10深入分析父子線(xiàn)程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果
- 01-10Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼
- 01-10解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法
- 01-10深入探討linux下進(jìn)程的最大線(xiàn)程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文
- 01-10DHCP:解析開(kāi)發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法詳解
- 01-10基于linux下獲取時(shí)間函數(shù)的詳解
- 01-10linux c 獲取本機(jī)公網(wǎng)IP的實(shí)現(xiàn)方法
- 01-10用c 獲取文件MD5值的實(shí)現(xiàn)方法
- 01-10解析C/C++中如何終止線(xiàn)程的運(yùn)行


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改