c/c++ 多執行緒 多個執行緒等待同一個執行緒的一次性事件
阿新 • • 發佈:2018-11-27
多執行緒 多個執行緒等待一個執行緒的一次性事件
背景:從多個執行緒訪問同一個std::future,也就是多個執行緒都在等待同一個執行緒的結果,這時怎麼處理。
辦法:由於std::future只能被呼叫一次get方法,也就是隻能被某一個執行緒等待(同步)一次,不支援被多個執行緒等待。所以std::sharted_future,就應運而生了。
特點:std::sharted_future可以被複制,std::future是不可以的被複制的。
std::sharted_future的3種建立方式(fut為std::future):
1,std::shared_future<int> sf2(std::move(fut));
2,std::shared_future<int> sf2 = fut.share();
3,std::shared_future<int> sf1(pro.get_future());
程式碼:
#include <iostream> #include <future> int do_get_value() { return 10; } void th1(std::shared_future<int> sf){ std::cout << sf.get() << std::endl; } void th2(std::shared_future<int> sf){ std::cout << sf.get() << std::endl; } int main(){ std::future<int> fut = std::async(do_get_value); //std::shared_future<int> sf2(std::move(fut)); //std::shared_future<int> sf2 = fut.share(); //std::thread t1(th1, sf2); //std::thread t2(th1, sf2); //t1.join(); //t2.join(); std::promise<int> pro; std::shared_future<int> sf1(pro.get_future()); std::thread t1(th1, sf1); std::thread t2(th1, sf1); pro.set_value(110); t1.join(); t2.join(); }