1. 程式人生 > >c/c++ 多執行緒 多個執行緒等待同一個執行緒的一次性事件

c/c++ 多執行緒 多個執行緒等待同一個執行緒的一次性事件

多執行緒 多個執行緒等待一個執行緒的一次性事件

背景:從多個執行緒訪問同一個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();
}

github原始碼

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854