Программисты больше не нужны!
Нужны ИИ инженеры! Хотите научиться? Вступайте в канал!
779 of 824 menu
◀ ▶

Класс barrier

Класс barrier представляет собой механизм синхронизации, который блокирует группу потоков до тех пор, пока все они не достигнут барьера. Когда последний поток достигает барьера, все ожидающие потоки освобождаются и продолжают выполнение. Первым параметром конструктор принимает количество потоков, которые должны достичь барьера, а вторым - функцию, которая вызывается при срабатывании барьера.

Синтаксис

#include <barrier> std::barrier<CompletionFunction> name(num);

Пример

Давайте создадим барьер для 3 потоков и посмотрим, как они синхронизируются:

#include <iostream> #include <thread> #include <barrier> using namespace std; int main() { barrier bar(3); auto task = [&bar](int id) { cout << "Thread " << id << " before barrier" << endl; bar.arrive_and_wait(); cout << "Thread " << id << " after barrier" << endl; }; thread t1(task, 1); thread t2(task, 2); thread t3(task, 3); t1.join(); t2.join(); t3.join(); return 0; }

Результат выполнения кода:

"Thread 1 before barrier" "Thread 2 before barrier" "Thread 3 before barrier" "Thread 1 after barrier" "Thread 2 after barrier" "Thread 3 after barrier"

Пример

Давайте создадим барьер с функцией завершения, которая выводит сообщение при срабатывании:

#include <iostream> #include <thread> #include <barrier> using namespace std; int main() { barrier bar(2, []() noexcept { cout << "Barrier completed!" << endl; }); auto task = [&bar](int id) { cout << "Thread " << id << " started" << endl; bar.arrive_and_wait(); cout << "Thread " << id << " finished" << endl; }; thread t1(task, 1); thread t2(task, 2); t1.join(); t2.join(); return 0; }

Результат выполнения кода:

"Thread 1 started" "Thread 2 started" "Barrier completed!" "Thread 1 finished" "Thread 2 finished"

Смотрите также

  • класс latch,
    который реализует одноразовый барьер
  • класс counting_semaphore,
    который управляет доступом к ресурсам
  • класс jthread,
    который автоматически присоединяет поток
  • метод join,
    который ожидает завершения потока
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить