gpt4 book ai didi

c++ - 等待线程完成以及将来

转载 作者:行者123 更新时间:2023-12-01 14:38:47 25 4
gpt4 key购买 nike

具有这样简单的代码:

void func(std::promise<int>* p) {
int a = 10, b = 5;
int result = a + b;
std::cout << "From inside the Thread...." << std::endl;
p->set_value(result);
}

int FP_main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread th(func, &p);
int ret = f.get();
std::cout << "returned val: " << ret << std::endl;

th.join();
return 0;
}
如果仅在上面两行有 join调用,为什么我们需要 get函数调用? get函数不是在等待线程完成吗?

最佳答案

因为线程不是 promise 。
promise 已完成,但线程尚未完成。

    p->set_value(result);
// ...
// HERE
// ...
}
那是 func的最后几行。现在,该线程将进行清理,调用析构函数等。当然,在“HERE”中,线程可能还要进行大量其他工作-您可以在此处编写一个1小时的任务来保持线程的 Activity 状态,而这与 promise 无关。
这可能已经很清楚了。
最后一个有趣的地方是:
int FP_main() {
//...
std::thread th(func, &p);
//...

th.join();
return 0;
}
“th”是局部变量。当main()返回时, th的析构函数将被调用。当相关线程未完成且未加入时,该析构函数将引发异常。
如果在设置promise的值后线程繁忙(即执行析构函数或进行一些1小时的工作),则在返回0后由}调用std::thread的析构函数;否则,返回0。会引发程序崩溃。因此,您需要加入。

关于c++ - 等待线程完成以及将来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63791115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com