Формирую задачу, которая будет выполняться в нескольких потоках с помощью stl следующим образом:
// подготовить данные
CTasksData tasksData;
// запустить потоки
std::mutex lock;
std::vector<std::thread> threads;
for (int threadIndex = 0; threadIndex < threadsAmount; threadIndex++)
{
threads.push_back(std::thread(&taskFunc, std::ref(lock), &tasksData));
}
// дождаться завершения потоков
for (auto& thread : threads)
{
if (thread.joinable())
thread.join();
}
Подскажите как корректно сделать следующее:
как только один из потоков завершается, то и все остальные потоки (не важно на каком этапе они были) прекращают выполняться
Я реализовал это через специальный флаг в CTasksData и потоки постоянно проверяют, установлен ли он
for ()
{
// проверка флага
// основной функционал
}
Недостаток такого подхода в том, что пока выполняется основной функционал, проверки не будет (хотя это и происходит быстро)
Да и когда я стал смотреть как загружены ядра, то у меня сложилось впечатление, что потоки как-то неохотно отпускаются.
Вот и хотелось бы, чтобы как только один из потоков прекращал выполнение, остальные сразу дохли бы... но корректно
Сборка персонального компьютера от Artline: умный выбор для современных пользователей