• c++ barrier 使用详解


    c++ barrier 使用详解

    std::barrier c++20

    • 头文件 #include
    • 作用:一般被用来协调多个线程,在所有线程都到达屏障点之后,才允许它们继续执行,对于需要线程间同步的并行算法和任务来说非常有用。
    • 使用步骤:
      • 创建 barrier 对象,并指定期待计数;
      • 在线程中调用 arrive 或者 arrive_and_wait 方法,使期待计数减一;
      • 当期待计数减为 0 后,即代表所有线程都已到达屏障点,barrier 会解除所有阻塞在屏障点上的线程并重置期待计数。
    • 注意事项:
      • 不同于 latch ,barrier 可重用;
      • 同时调用 barrier 的成员函数,除了析构函数,不引入数据竞争;
      • 在同一个线程中,可以多次减少期待计数;

    std::barrier 成员函数

    • arrive:到达屏障并减少期待计数。
    • wait:阻塞当前线程,直至期待计数减为 0。
    • arrive_and_wait:到达屏障并把期待计数减少一,然后阻塞直至期待计数减为 0。
    • arrive_and_drop:到达屏障并把期待计数减少一并使后续阶段的初始期待计数减一。

    使用示例

    • 线程 1 和 线程 2 先各自执行一些任务,然后在屏障点上等待直到所有线程抵达后再继续执行后续代码:

      #include 
      #include 
      #include 
      #include 
      
      using namespace std::literals;
      
      constexpr int num_threads = 2;
      std::barrier barrier(num_threads);
      std::vector<int> v1;
      std::vector<int> v2;
      
      void f1()
      {
          for (int i = 0; i < 2; i++) {
              v1.push_back(i);
              // 到达屏障点并阻塞
              barrier.arrive_and_wait();
              // 所有线程都到达屏障点后,继续执行
              printf("v2[%d] = %d\n", i, v2[i]);
          }
      }
      
      void f2()
      {
          for (int i = 0; i < 2; i++) {
              v2.push_back(i);
              // 到达屏障点并阻塞
              barrier.arrive_and_wait();
              // 所有线程都到达屏障点后,继续执行
              printf("v1[%d] = %d\n", i, v1[i]);
          }
      }
      
      
      int main()
      {
          std::jthread t1(f1);
          std::jthread t2(f2);
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
  • 相关阅读:
    数据提取的艺术:如何通过数据治理提高效率
    测试记录-提测规范
    Vim 项目重要维护者去世,Vim 之父以 Vim 9 悼念挚友
    pom的配置策略
    Mac下,protoc-gen-go-grpc: program not found or is not executable问题的解决
    [IAGC] Kafka消费者组的负载均衡策略
    【k8s】YAML语言基础
    【学习笔记】NOIP模拟赛
    FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)
    C语言assert函数:什么是“assert”函数
  • 原文地址:https://blog.csdn.net/luohaha66/article/details/134416740