多線程 等待一次性事件 future概念 背景:有時候,一個線程只等待另一個線程一次,而且需要它等待的線程的返回值。 案例:滴滴叫車時,點完了叫車按鈕後,叫車的後臺線程就啟動了,去通知周圍的計程車。這時,用戶就可以去乾別的了,而且用戶只等待叫車的線程一次就夠了,也就是有計程車應答了,這個等待就結束了 ...
多線程 等待一次性事件 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(return_from_thread, 10);
do_something();
std::cout << "車來了,車牌號:" << ret.get() << std::endl;
std::cout << "end" << std::endl;
}
編譯方法:
g++ -g XXX.cpp -std=c++11 -pthread
運行結果:
在等滴滴來車
車來了,車牌號:10
10
end
知識點:
- 調用get方法後,當前線程就會被阻塞,知道被等待的線程結束。