У меня есть очередь идентификаторов потока работников в 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