с++: прекратить выполнение всех потоков

78
16 января 2022, 22:30

Формирую задачу, которая будет выполняться в нескольких потоках с помощью 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 ()
{
    // проверка флага
    // основной функционал 
}

Недостаток такого подхода в том, что пока выполняется основной функционал, проверки не будет (хотя это и происходит быстро)

Да и когда я стал смотреть как загружены ядра, то у меня сложилось впечатление, что потоки как-то неохотно отпускаются.

Вот и хотелось бы, чтобы как только один из потоков прекращал выполнение, остальные сразу дохли бы... но корректно

READ ALSO
Проблема обработки строк в с++

Проблема обработки строк в с++

Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:

82
Несколько auto в объявлении функции

Несколько auto в объявлении функции

Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения:

131
Запуск MPI программы без mpiexec/mpirun

Запуск MPI программы без mpiexec/mpirun

Какое поведение следует ожидать при запуске MPI программы без mpiexec/mpirun, но скомпилированной с помощью MPI компилятора? Специфицировано ли оно...

46
Как удалить элемент в линейном списке?

Как удалить элемент в линейном списке?

Создал линейный список и заполнил числами от 0 до 10Как удалить элемент списка, значение которого равно 5? Пожалуйста, подскажите

78