1

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

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
    }
}

我如何发送这样的信号?

4

1 回答 1

4

我不会使用async,因为那太高级了,而且会做其他事情。(这里是我的一点咆哮,涉及到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();
}

一旦运行时间最长的线程完成,这将完成。(“长尾”效应。)

于 2013-05-03T21:31:27.057 回答