本篇文章为大家展示了如何在c++ 11项目中获取线程的返回值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强>有两种方法可以实现这个需求:强>
<强> 1。传统的方法:在线程间共享指针强>
传递一个指针给压缩文件的线程,表示压缩文件的线程将会把值写入指针指向的内存空间。此时主线程将用条件变量等待值被写入,当压缩文件线程把值写入指针指定的内存后,将唤醒(信号)条件变量,然后主线程将被唤醒,然后从指针指向的内存中获取返回值。
为了实现获取一个返回值的需求,使用传统的方法,我们需要条件变量(条件变量),互斥量(互斥)和指针三个对象。
如果假设,我们需要获得压缩线程里三个返回值,情况会变得更加复杂。
那std::未来就是来简化这个编程过程的
<强> 2。c++ 11的方法:使用std::未来和std::承诺强>
人如其名,<代码> std::未来代码>和<代码> std::承诺> 代码对象就和他们的名字一样。这两个类在获取程序返回值的时候需要配合使用
std::未来,是一个类模板,它存储着一个未来的值。
那问题来了,未来的值是什么鬼?
实际上一个std::未来对象里存储着一个在未来会被赋值的变量,这个变量可以通过std::未来提供的成员函数std::::获得()来得到。如果在这个变量被赋值之前就有别的线程试图通过std::::获得()获取这个变量,那么这个线程将会被阻塞到这个变量可以获取为止。
<代码> std::承诺> 代码同样也是一个类模板,它的对象承诺会在未来设置变量(这个变量也就是std::中未来的变量)。每一个std::承诺对象都有一个与之关联的std::未来对象。当std::承诺设置值的时候,这个值就会赋给std::中未来的对象了。
我们一步一步来看一下如何做
在主线程中创建std::承诺对象
<代码> std:: promise
上面定义的承诺对象还没有任何关联的值。但是它承诺某个线程将会设置与其关联的值,并且,当值被设置以后,可以通过与承诺关联的std::未来对象来获取该值。
假设我们的主线程将创建的std::承诺对象传递给了压缩线程,那主线程要怎么知道压缩线程已经设置好了值呢?
答案就是使用std::未来对象
//, main 线程 std:: future在压缩线程未执行set_value()时,如果主线程调用了futureObj.get(),那么主线程将会被阻塞。
看整个时序图:
最终代码
# 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项目中获取线程的返回值