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 に答える