在 C++11 中发信号通知父线程

Posted

技术标签:

【中文标题】在 C++11 中发信号通知父线程【英文标题】:signaling parent threads in c++11 【发布时间】:2013-04-28 09:08:31 【问题描述】:

我有一个想要在不同线程中运行的函数。该函数填充一个数据结构,例如:

per_thread(int start_value, std::vector<SomeStruct>& reference)

    for ( size_t i = 0; i < 500; i++ )
    
        reference.push_back(func(i));
        if (i == 2)
            send_signal_back();
    

但是,在循环多次完成后,我想启动另一个线程,使用它作为起始值。不幸的是,我不明白如何将信号发送回父线程。

所以我想要这样的东西:

for( size_t j = 0; j < 5000; j += num_threads)

    for (size_t i = 0; i < num_threads; i++)
    
        std::async(per_thread(foo(j+i), std::ref(vec));
        //wait for signal
    

如何发送这样的信号?

【问题讨论】:

线程之间没有“父子”关系。线程只是线程。也许您在考虑流程? @KerrekSB:没有强制的父子关系,但是一些线程创建了一些其他线程(除了主线程),所以从这个意义上说,存在父子关系。我没有考虑流程,至少据我所知没有。总的来说,我对并发还是很陌生。 来点condition variable怎么样? 一个(线程安全)消息队列并让主线程定期检查它怎么样? 并发真的很难......无论如何,不​​,真的没有这种关系,就C++而言。所有的线程实际上只是线程。他们都做同样的事情。确实只有一个线程进入main,但这并不重要。 【参考方案1】:

我不会使用async,因为这太高级了,而且还有其他用途。 (这里有一个little rant of mine 涉及async。)

看起来你真的只是想要线程并手动控制它们。

试试这个:

#include <vector>
#include <thread>

std::vector<std::thread> threads;

for (std::size_t j = 0; j < 5000; j += num_threads)

    for (std::size_t i = 0; i != num_threads; ++i)
    
         threads.emplace_back(per_thread, foo(i + j), std::ref(vec));
    


for (auto & t: threads)

    t.join();

这将在 最长运行 线程完成后完成。 (“长尾”效应。)

【讨论】:

因此,当这样做时,线程是相当独立的:第二个线程不依赖于第一个线程的中间结果。我想我的问题可能不是很清楚,我会尝试解决它。​​ @AndrewSpott:好的,但是让我警告您,如果您的各个轮次相互依赖,那么在开始编写代码之前,您应该认真考虑并行化设计。并行代码共享不佳可能比单线程代码慢得多。您希望尽可能避免任何类型的分享。 我觉得现在清楚一点了。 func 代表一些计算量大的函数,它只取决于它的输入,这就是为什么我肯定这会加快我的代码

以上是关于在 C++11 中发信号通知父线程的主要内容,如果未能解决你的问题,请参考以下文章

C# 线程间互相通信

信号量vs互斥锁(Semaphore vs Mutex)

没有保持锁的条件变量上的信号

进程和线程之间的通信

Flask信号管理

Linux进程信号