2013-05-03 3 views
1

У меня есть функция, которую я хочу запускать в разных потоках. Функция заполняет структуру данных, например:сигнализация родительских потоков в C++ 11

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

Между потоками нет отношения «родитель-ребенок». Нити - это просто потоки. Может быть, вы думаете о процессах? –

+1

@KerrekSB: Не существует принудительных отношений между родителями и дочерними элементами, но какой-то поток создает другой поток (кроме основного потока), поэтому в этом смысле отношения родитель-ребенок. Я не думаю о процессах, по крайней мере, не настолько, насколько я понимаю. Я все еще новичок в параллелизме в целом. –

+0

Как насчет некоторой [переменной условия] (http://en.cppreference.com/w/cpp/thread/condition_variable)? –

ответ

4

Я бы не использовал 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(); 
} 

Это закончат когда затяжных нить закончилась. (Эффект «длинный хвост».)

+0

Итак, при этом потоки довольно независимы: второй поток не зависит от промежуточного результата первого потока. Я думаю, что мой вопрос может быть не очень понятным, я попытаюсь это исправить. –

+3

@AndrewSpott: Хорошо, но позвольте мне предупредить вас, что если ваши индивидуальные раунды зависят друг от друга, тогда вы должны очень серьезно подумать о дизайне параллелизации, прежде чем начинать кодирование. Плохое совместное использование параллельного кода может быть катастрофически медленнее, чем однопоточный код. Вы хотите как можно больше избегать * любого * совместного использования. –

+0

Я думаю, что теперь это немного яснее. 'func' представляет собой некоторую вычислительно дорогостоящую функцию, которая зависит только от ее входов, поэтому я уверен, что это ускорит мой код –

Смежные вопросы