【问题标题】:signaling parent threads in c++11在 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,但这并不重要。

标签: c++ c++11 concurrency std


【解决方案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 代表一些计算量大的函数,它只取决于它的输入,这就是为什么我肯定这会加快我的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多