std:: thread 可以获取返回值吗?
时间: 2023-07-20 09:42:19 浏览: 259
可以的。
C++11中的`std::thread`类提供了`std::thread::join()`和`std::thread::detach()`方法两种方式来等待线程结束。但这两种方式都无法获取线程的返回值。要想获取线程的返回值,可以使用`std::future`和`std::promise`这两个类。
`std::promise`类是一个可以保存一个值的对象,该值可以在某个时刻被设置。而`std::future`类则是一个与`std::promise`对象相关联的对象,它可以等待`std::promise`对象中的值被设置,并在值被设置后获取该值。
下面是一个例子:
```cpp
#include <iostream>
#include <thread>
#include <future>
void func(std::promise<int> p) {
// do some work
int result = 42;
// set the value of the promise
p.set_value(result);
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(func, std::move(p));
t.join();
// get the value from the future
int result = f.get();
std::cout << "The result is " << result << std::endl;
return 0;
}
```
在上面的例子中,`func`函数接收一个`std::promise<int>`对象作为参数,并在函数中计算出一个值,然后调用`p.set_value(result)`设置该值。在`main`函数中,我们首先创建了一个`std::promise<int>`对象`p`,并调用`p.get_future()`方法获取一个与该`std::promise`对象相关联的`std::future<int>`对象`f`。然后我们创建了一个线程`t`,并将`p`对象作为参数传入。在线程中,我们调用`p.set_value(result)`设置了`std::promise`对象的值。在`main`函数中,我们调用`f.get()`方法获取`std::future`对象中的值,即线程函数`func`的返回值。最后输出结果。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)