在 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 中发信号通知父线程的主要内容,如果未能解决你的问题,请参考以下文章