多線程 等待一次性事件 future概念
背景:有時候,一個線程只等待另一個線程一次,而且需要它等待的線程的返回值。
案例:滴滴叫車時,點完了叫車按鈕后,叫車的后台線程就啟動了,去通知周圍的出租車。這時,用戶就可以去干別的了,而且用戶只等待叫車的線程一次就夠了,也就是有出租車應答了,這個等待就結束了,不會去再次等待有別的出租車應答。應答后,叫車的線程會返回出租車的車牌號,出租車的位置等信息,給叫車的用戶。
問題:實現上面的場景,很容易就聯想到用多線程去實現,但是std::thread是沒有返回值,所以無法得到某個線程的返回值。
std::future解決了這個問題。future是有返回值的,並且只等待某個線程一次。
future用法:在用戶叫車時間點,調用std::async方法,啟動叫車,叫車成功后,叫車線程通知用戶線程,用戶線程調用future對象的get()方法,得到出租車的具體信息。
future是模板類,線程方法返回值的類型,就是模板的類型。
代碼:
#include <future>
#include <iostream>
#include <unistd.h>
int return_from_thread(int val){
std::cout << val << std::endl;
//sleep(1);
return val;
}
void do_something(){
std::cout << "在等滴滴來車" << std::endl;
}
int main(){
//std::future<int> ret = std::async(std::launch::deferred,return_from_thread, 10);
//std::future<int> ret = std::async(std::launch::async,return_from_thread, 10);
std::future<int> ret = std::async(return_from_thread, 10);
do_something();
//ret.wait();
std::cout << "車來了,車牌號:" << ret.get() << std::endl;
std::cout << "end" << std::endl;
}
github源代碼
編譯方法:
g++ -g XXX.cpp -std=c++11 -pthread
運行結果:
在等滴滴來車
車來了,車牌號:10
10
end
知識點:
- 調用get方法后,當前線程就會被阻塞,知道被等待的線程結束。
std::async第一個參數決定:是開啟一個新的線程,還是不開新的線程
- std::launch::async:開啟一個新的線程,執行指定的方法。
- std::launch::deferred:不開新的線程,直到在future上調用wait()或者get()方法,才會執行指定的方法。
- std::launch::deferred | std::launch::async:由系統決定是開一個新的線程還是不開。
- 不指定第一個參數的效果和std::launch::deferred | std::launch::async相同。
c/c++ 學習互助QQ群:877684253
本人微信:xiaoshitou5854