如何实现多线程中一个子线程先结束,主线程继续执行

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/…。这也适用于多个生产者,这将解决您的问题。

以上是关于如何实现多线程中一个子线程先结束,主线程继续执行的主要内容,如果未能解决你的问题,请参考以下文章

如何使“主线程”等待“子线程”执行结束后再继续执行

windows API主线程如何等待子线程结束后再继续运行

如何实现线程互等,线程2等待线程1结束后才继续执行。(可设置标志位) 求源代码

多线程实现udp网络通信

主线程啥都没做,就会等待子线程结束。这是为啥?

如何实现java主线程等待子线程执行完毕之后再执行