Класс 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,
который ожидает завершения потока