C++ 如何从std::thread返回值

C++ 如何从std::thread返回值,c++,multithreading,C++,Multithreading,我有一个返回值的函数。我想为doSth函数使用线程,并为上面的变量设置返回值,下面是一个示例: #include <string> #include <iostream> #include <thread> using namespace std; // func for execution int doSth(int number) { return number; } int main() { // some code ...

我有一个返回值的函数。我想为
doSth
函数使用线程,并为上面的变量设置返回值,下面是一个示例:

#include <string>
#include <iostream>
#include <thread>

using namespace std;

// func for execution
int doSth(int number)
{
    return number;
}

int main()
{
    // some code ...
    int numberOne; // no value now, but in thread I want to set a value from it
    int numberTwo; // depending on function input value
    thread t1(doSth, 1); // set numberOne = 1;
    thread t2(doSth, 2); // set numberTwo = 2;
    // wait them to execute
    t1.join();
    t2.join();
    // now I should have numberOne = 1; numberTwo = 2
    // some code ...
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
//执行职能
int doSth(int编号)
{
返回号码;
}
int main()
{
//一些代码。。。
int numberOne;//现在没有值,但在线程中我想从中设置一个值
int numberTwo;//取决于函数输入值
线程t1(doSth,1);//set numberOne=1;
线程t2(doSth,2);//set numberTwo=2;
//等待他们执行
t1.join();
t2.连接();
//现在我应该有numberOne=1;numberTwo=2
//一些代码。。。
返回0;
}
我怎么做呢

如何从std::thread返回值

除了其他答案中显示的
std::async
,您还可以使用
std::packaged_task

std::packaged_task<int(int)> task{doSth};
std::future<int> result = task.get_future();
task(1);
int numberOne = result.get();
std::打包的_任务{doSth};
std::future result=task.get_future();
任务(1);
int numberOne=result.get();
这允许分离任务的创建,并在需要时执行它

如何从std::thread返回值

除了其他答案中显示的
std::async
,您还可以使用
std::packaged_task

std::packaged_task<int(int)> task{doSth};
std::future<int> result = task.get_future();
task(1);
int numberOne = result.get();
std::打包的_任务{doSth};
std::future result=task.get_future();
任务(1);
int numberOne=result.get();

这允许分离任务的创建,并在需要时执行它。

方法1:使用
std::async
(线程和未来的更高级别包装):

#包括
#包括
#包括
int func(){return 1;}
int main(){
std::future ret=std::async(&func);
int i=ret.get();

std::cout方法1:使用
std::async
(线程和未来的更高级包装):

#包括
#包括
#包括
int func(){return 1;}
int main(){
std::future ret=std::async(&func);
int i=ret.get();

std::cout我首选的方法是将调用封装在一个不返回任何内容的特定方法中(并以相同的方式管理错误)


我首选的方法是将调用封装在一个不返回任何内容的特定方法中(并以相同的方式管理错误)


这类问题最好用instead来解决。它基本上是一个可以返回的线程。@FrançoisAndrieux你能告诉我如何使用
std::async
,来解决这类问题吗?我之前的评论包含函数文档的链接。它包含示例。这类问题最好用instead来解决。它是baSicaly是一个可以返回的线程。@FrançoisAndrieux你能告诉我如何使用
std::async
来完成这类事情吗?我之前的评论包含了函数文档的链接。它包含了一些示例。这并没有解决问题,但这段代码不需要
std::endl
所需要的额外内容。
 “\n”
结束一行。这并不能解决问题,但此代码不需要像
std::endl
那样的额外内容。
“\n”
结束一行。
#include <thread>
#include <future>
#include <iostream>


void func(std::promise<int> && p) {
    p.set_value(1);
}

int main(){
    std::promise<int> p;
    auto f = p.get_future();
    std::thread t(&func, std::move(p));
    t.join();
    int i = f.get();

    std::cout<<"I: "<<i<<std::endl;

    return 0;
}
void try_doSth(int number, int* return_value, int* status)
{
  try
  {
    *return_value = doSth(number);
    *status = 0;
   }
  catch(const std::exception& e) { *status = 1; }
  catch(...) { *status = 2; }
}

int r1,r2,s1,s2;
std::thread t1(try_doSth, 1, &r1, &s1);
std::thread t2(try_doSth, 2, &r2, &s2);