如何实现多线程中一个子线程先结束,主线程继续执行
Posted
技术标签:
【中文标题】如何实现多线程中一个子线程先结束,主线程继续执行【英文标题】:How to achieve that a sub-thread in multithreading ends first, and the primary thread continues to execute 【发布时间】:2022-01-05 01:11:35 【问题描述】:我尝试实现一个功能:主线程创建多个子线程并阻塞主线程,当任何一个子线程结束时唤醒主线程继续执行。
以下代码是我在C++11中使用std::future的尝试:
std::pair<size_t, size_t> fun(size_t i, size_t j)
std::this_thread::sleep_for(std::chrono::seconds(i * j));
return i, j ;
int main()
std::shared_future<std::pair<size_t, size_t>> ret;
std::pair<size_t, size_t> temp;
ret = std::async(std::launch::async, fun, 10, 9);
ret = std::async(std::launch::async, fun, 5, 4);
ret = std::async(std::launch::async, fun, 2, 1);
temp = ret.get();
std::cout << temp.first << "\t" << temp.second << "\n";
return 0;
对于结果,我希望程序在(2 * 1)秒后直接输出“2 1”并结束主线程,但在我的尝试中,程序需要等待第一个子线程休眠(10 * 9) 秒前输出“2 1”并结束主线程。
【问题讨论】:
您可以在问题中添加minimal reproducible example 内联吗?不是图片,复制起来很不方便!另外,作为新用户,请使用tour 并阅读How to Ask。关于您的问题,您不应该陷入一种误解:线程没有父/子关系。您在此处使用了稍微模棱两可的措辞。 你如何描述它,你需要一个主线程睡眠的条件变量,子线程应该在退出之前发出信号。 【参考方案1】:你的代码有一些问题:
-
使用您调用
std::async
的方式,您根本无法保证获得任何线程。你需要传递 std::launch::async
作为第一个参数来达到你想要的效果。请参阅文档:https://en.cppreference.com/w/cpp/thread/async
std::async 返回一个未来,您将其存储在ret
中。但是在下一行中,您将覆盖ret
中的值。这会导致从您的第一个线程返回的未来被破坏。当从std::async
返回的future 即将被销毁时,它们会阻塞当前线程,直到它们完成。请参阅std::async
文档的“注释”部分。
不幸的是,在没有任何附加库的情况下,在 c++ 中您要实现的目标出人意料地困难。没有简单的方法可以说“等到这些线程之一完成”。如果您只想使用 STL,则必须在第一个子线程准备好时使用“条件变量”向主线程发出信号。
【讨论】:
对不起,我是一个多线程新手。如何通过“条件变量”向主线程发出信号?能否给我一个演示或链接来学习,谢谢? 本教程展示了生产者-消费者的实现:riptutorial.com/cplusplus/example/13552/…。这也适用于多个生产者,这将解决您的问题。以上是关于如何实现多线程中一个子线程先结束,主线程继续执行的主要内容,如果未能解决你的问题,请参考以下文章