我有一个函数,我想在不同的线程中运行。该函数填充数据结构,例如:
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
}
}
如何发送此类信号?
答案 0 :(得分:4)
我不会使用async
,因为它太高级别并且做其他事情。 (这是触及async
的{{3}}。)
看起来你真的只想要线程并手动控制它们。
试试这个:
#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();
}
这将在运行时间最长的线程完成后完成。 (“长尾”效应。)