Управление пробуждением потока работника в C ++: отдельные и общие переменные условия?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Управление пробуждением потока работника в C ++: отдельные и общие переменные условия?

Сообщение Anonymous »

У меня есть очередь идентификаторов потока работников в C ++, и поток координатора разбудит каждую потоку по порядку. Затем прозвенный нить взаимодействует с потоком координатора, чтобы выполнить некоторую работу. После того, как это сделано, координатор разбудит следующий поток. > Отдельные переменные условия : Каждый рабочий поток имеет свой собственный std :: condition_variable , хранящийся в очереди вместе с идентификатором потока. Координатор сигнализирует о переменной соответствующей условия, чтобы разбудить конкретный поток. >, используя предикат, чтобы проверить, соответствует ли их идентификатор, который выбран координатором. strong> < /p>
Поток координатора: < /p>
while (true) {
{
std::lock_guard lock(mtx);
id_chosen_by_coordinator = workerThreads.front();
workerThreads.pop();
}
cv.notify_all(); // Wake up all worker threads, but only one will proceed
...
}

< /code>
Worker Thread: < /p>
std::unique_lock lock(mtx);
cv.wait(lock, []() { return myid == id_chosen_by_coordinator; });
...

< /code>
Какой из этих подходов предпочтительнее с точки зрения эффективности и правильности? Существуют ли потенциальные подводные камни с подходом с переменным условием, такими как ненужные пробуждения или условия гонки?

Подробнее здесь: https://stackoverflow.com/questions/794 ... -variables
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»