std::barrier 类是 C++20 中引入的新同步原语,它有助于同步处理共同任务的多个线程。它作为一个屏障,所有线程都必须到达该屏障,程序才能继续运行。尽管 std::barrier 对象与 std::mutex 或 std::condition_variable 类似,但有一些显著差异使其独一无二。
std::barrier 如何工作?
创建 std::barrier 对象时,必须指定参与线程的数量。参与屏障的每个线程在到达屏障时都会使用 std::barrier::arrive_and_wait() 函数。 std::barrier 对象监视有多少线程已到达屏障。当所有线程都到达屏障时,屏障就会解除,所有线程都可以恢复执行。
std::barrier 类允许用户指定在屏障解除后执行的回调函数,从而将自己与其他同步原语区分开来。此回调函数可以执行跨越障碍后必须完成的其他任务。此函数增强了 std::barrier 类的灵活性和多函数性,使其成为 C++20 中多线程编程的有用工具。
例子:
C++
// C++ Program to demonstrate use of use std::barrier in
#include <barrier>
#include <iostream>
#include <thread>
std::barrier my_barrier{ 3 };
void my_function()
{
my_barrier.arrive_and_wait();
}
int main()
{
// creating threads
std::thread t1(my_function);
std::thread t2(my_function);
std::thread t3(my_function);
t1.join();
t2.join();
t3.join();
std::cout << "All threads have finished\n";
return 0;
}
输出:
All threads have finished
上述程序的解释:
在此示例中,我们演示如何使用 std::barrier 类来同步处理公共任务的多个线程。我们创建 std::barrier 类的一个实例,名为 my_barrier,计数为 3。创建了三个调用 my_function() 的线程。在屏障处,每个线程调用my_barrier.arrive_and_wait()来停止执行,直到所有其他线程都到达屏障。一旦所有线程都到达,屏障就会解除,所有线程都会被释放以恢复执行。完成后,控制台显示消息“所有线程已完成。”。
相关用法
- C++20 std::endian用法及代码示例
- C++ cos()用法及代码示例
- C++ sin()用法及代码示例
- C++ asin()用法及代码示例
- C++ atan()用法及代码示例
- C++ atan2()用法及代码示例
- C++ acos()用法及代码示例
- C++ tan()用法及代码示例
- C++ sinh()用法及代码示例
- C++ ceil()用法及代码示例
- C++ tanh()用法及代码示例
- C++ fmod()用法及代码示例
- C++ acosh()用法及代码示例
- C++ asinh()用法及代码示例
- C++ floor()用法及代码示例
- C++ atanh()用法及代码示例
- C++ log()用法及代码示例
- C++ trunc()用法及代码示例
- C++ round()用法及代码示例
- C++ lround()用法及代码示例
- C++ llround()用法及代码示例
- C++ rint()用法及代码示例
- C++ lrint()用法及代码示例
- C++ log10()用法及代码示例
- C++ modf()用法及代码示例
注:本文由纯净天空筛选整理自mukulsomukesh大神的英文原创作品 std::barrier in C++20。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。