当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++20 std::barrier用法及代码示例


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()来停止执行,直到所有其他线程都到达屏障。一旦所有线程都到达,屏障就会解除,所有线程都会被释放以恢复执行。完成后,控制台显示消息“所有线程已完成。”。


相关用法


注:本文由纯净天空筛选整理自mukulsomukesh大神的英文原创作品 std::barrier in C++20。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。