如何在c++ 11项目中获取线程的返回值

  介绍

本篇文章为大家展示了如何在c++ 11项目中获取线程的返回值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>有两种方法可以实现这个需求:

<强> 1。传统的方法:在线程间共享指针

传递一个指针给压缩文件的线程,表示压缩文件的线程将会把值写入指针指向的内存空间。此时主线程将用条件变量等待值被写入,当压缩文件线程把值写入指针指定的内存后,将唤醒(信号)条件变量,然后主线程将被唤醒,然后从指针指向的内存中获取返回值。

为了实现获取一个返回值的需求,使用传统的方法,我们需要条件变量(条件变量),互斥量(互斥)和指针三个对象。
如果假设,我们需要获得压缩线程里三个返回值,情况会变得更加复杂。

那std::未来就是来简化这个编程过程的

<强> 2。c++ 11的方法:使用std::未来和std::承诺

人如其名,<代码> std::未来和<代码> std::承诺>

std::未来,是一个类模板,它存储着一个未来的值。
那问题来了,未来的值是什么鬼?

实际上一个std::未来对象里存储着一个在未来会被赋值的变量,这个变量可以通过std::未来提供的成员函数std::::获得()来得到。如果在这个变量被赋值之前就有别的线程试图通过std::::获得()获取这个变量,那么这个线程将会被阻塞到这个变量可以获取为止。

<代码> std::承诺>

我们一步一步来看一下如何做

在主线程中创建std::承诺对象

<代码> std:: promisepromiseObj;

上面定义的承诺对象还没有任何关联的值。但是它承诺某个线程将会设置与其关联的值,并且,当值被设置以后,可以通过与承诺关联的std::未来对象来获取该值。

假设我们的主线程将创建的std::承诺对象传递给了压缩线程,那主线程要怎么知道压缩线程已经设置好了值呢?
答案就是使用std::未来对象

//, main 线程   std:: future

在压缩线程未执行set_value()时,如果主线程调用了futureObj.get(),那么主线程将会被阻塞。

看整个时序图:

如何在c++ 11项目中获取线程的返回值

最终代码

# include,,//std:: cout  std:: endl   # include,,,//std::线程   # include,,,//std:: future  std::承诺   # include,,,//std::裁判   # include,,,//std::空间:秒      void  initiazer (std:: promise,, promiseObj) {   std::才能cout  & lt; & lt;,“Inside 线程:,“,& lt; & lt;, std:: this_thread: get_id (), & lt; & lt;, std:: endl;   std::才能this_thread: sleep_for (std::空间:秒(1));   promiseObj.set_value才能(35);   }      int  main () {   std::才能promise, promiseObj;   std::才能future, futureObj =, promiseObj.get_future ();   std::才能thread  th (initiazer, std::裁判(promiseObj));   ,,   std::才能cout  & lt; & lt;, futureObj.get (), & lt; & lt;, std:: endl;      th.join才能();   return 才能;0;   }

上述内容就是如何在c++ 11项目中获取线程的返回值,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

如何在c++ 11项目中获取线程的返回值