C++ 库 - <barrier>



C++20 中的<barrier>有助于在并发编程中协调多个线程的执行。它使线程能够在共同点或屏障处相互等待,然后再继续执行。当所有线程到达屏障时,它们将被释放以执行其任务。

屏障对象初始化为特定数量的参与线程,称为完成阶段。当每个线程完成其任务并到达屏障时,它将调用 arrive_and_wait() 函数。

包含 <barrier> 头文件

要在您的 C++ 程序中包含 <barrier> 头文件,可以使用以下语法。

#include <barrier>

<barrier> 头文件的函数

以下是 <barrier> 头文件中所有函数的列表。

序号 函数及描述
1 arrive

到达屏障并减少预期计数。

2 wait

在阶段同步点阻塞,直到其阶段完成步骤运行。

3 arrive_and_wait

到达屏障并将预期计数减少 1,然后阻塞直到当前阶段完成。

4 arrive_and_drop

将后续阶段的初始预期计数和当前阶段的预期计数都减少 1。

5 max

返回实现支持的预期计数的最大值。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

使用 arrive_and_wait()

在以下示例中,我们将为两个线程创建一个屏障,它们将在继续执行之前相互等待。

std:barrier 类是在 C++20 中引入的,因此要运行此代码,编译器必须支持 C++20。

#include <iostream> #include <barrier> #include <thread> void x(std::barrier < > & sync_point, int id) { std::cout << "Thread " << id << " has reached the barrier.\n"; sync_point.arrive_and_wait(); std::cout << "Thread " << id << " has crossed the barrier.\n"; } int main() { std::barrier sync_point(2); std::thread t1(x, std::ref(sync_point), 1); std::thread t2(x, std::ref(sync_point), 2); t1.join(); t2.join(); return 0; }

输出

以下是上述代码的输出:

Thread 2 has reached the barrier.
Thread 1 has reached the barrier.
Thread 1 has crossed the barrier.
Thread 2 has crossed the barrier.
广告