首页 > 编程语言 >C++20新特性-barrier

C++20新特性-barrier

时间:2024-03-17 15:44:54浏览次数:23  
标签:std 20 barrier C++ 屏障 线程

 

以下内容由 豆包 大语言模型生成,内容仅供参考:

 

C++20 引入了一个新的标准库头文件 <barrier>,其中包含了对屏障(barrier)的支持。屏障是一种用于同步多个线程的同步原语,它允许线程在某个点上等待,直到所有线程都到达该点。

C++20 的 <barrier> 头文件提供了一个 std::barrier 类,用于实现屏障。std::barrier 类的构造函数接受一个整数参数,表示屏障上的线程数量。在调用 std::barrier::arrive() 函数时,当前线程会被阻塞,直到所有线程都调用了 arrive() 函数。一旦所有线程都到达了屏障,它们就会被唤醒,并继续执行。

 

以下是一个使用 std::barrier 的简单示例:

C++ 中的 `std::barrier` 是一个同步原语,用于协调多个线程之间的同步操作。它提供了两个主要的函数:`arrive()` 和 `wait()`。
下面是一个使用 `std::barrier` 的简单例子:
#include <iostream>
#include <barrier>
#include <thread>

// 任务函数
void task(int threadId) {
    std::cout << "Thread " << threadId << " 正在执行任务...\n";

    // 到达屏障
    std::barrier::arrive();

    std::cout << "Thread " << threadId << " 完成任务并等待其他线程...\n";

    // 等待其他线程到达屏障
    std::barrier::wait();

    std::cout << "Thread " << threadId << " 继续执行其他任务...\n";
}

int main() {
    // 创建一个有 3 个线程的屏障
    std::barrier barrier(3);

    std::thread threads[3];

    // 创建并启动 3 个线程
    for (int i = 0; i < 3; ++i) {
        threads[i] = std::thread(task, i);
    }

    // 等待所有线程完成
    for (int i = 0; i < 3; ++i) {
        threads[i].join();
    }

    return 0;
}

 

在这个例子中,我们创建了一个包含 3 个线程的屏障。每个线程在执行任务之前,先调用 `arrive()` 函数到达屏障,然后执行任务。当所有线程都到达屏障后,它们会调用 `wait()` 函数等待其他线程。当所有线程都完成任务并等待其他线程时,屏障被打破,所有线程继续执行其他任务。
这个例子简单地演示了屏障的基本功能和语法。在实际应用中,你可以根据需要在屏障上执行更复杂的同步操作。

标签:std,20,barrier,C++,屏障,线程
From: https://www.cnblogs.com/music-liang/p/18078675

相关文章

  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目链接:园丁的烦恼挺经典的题目,转化成二维数点去做这玩意和常规的偏序计数问题有区别:转化为求\(a\lex\leb\\&\&\c\ley\led\)的数量,这种就别想着拆来拆去了,这种权值类带偏序计数类问题,是经典的可差性问题,我们计:\(ans(x,l,r)\)表示\(t\lex,l\ley\ler\)的数......
  • 【经验】关于c++11中string类型字符串和整形相互转化的用法
    https://blog.csdn.net/Elephant_King/article/details/129225134 c++11中为我们提供了许多非常方便的函数,可以帮助我们在整形与string类型字符串进行转换关于Dev-c++如何使用c++11,因为本人是mac系统,使用cLion,无法安装Dev,可以在网上搜其他教程实现整形转字符串(to_string())to_s......
  • 《A ConvNet for the 2020s》阅读笔记
    论文标题《AConvNetforthe2020s》面向2020年代的ConvNet作者ZhuangLiu、HanziMao、Chao-YuanWu、ChristophFeichtenhofer、TrevorDarrell和SainingXie来自FacebookAIResearch(FAIR)和加州大学伯克利分校初读摘要“ViT盛Conv衰”的现状:视觉识......
  • 常见排序算法(C/C++)--- 动画演示
        本篇将介绍一些常见的排序算法,如插入排序:直接插入排序、希尔排序;选择排序:选择排序、堆排序;交换排序:快速排序、冒泡排序;以及最后的归并排序。    对于以上的排序算法,我们总结了每种排序算法的特性,接着对直接插入排序进行了优化;然后实现了归并排序和快速排......
  • 2024 年 AI 辅助研发趋势
    2024年AI辅助研发趋势随着人工智能技术的持续发展与突破,2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计,从软件开发到材料科学,AI正逐渐渗透到研发的各个环节,变革着传统的研发模式。在这一背景下,AI辅助研发不仅提升了研发效率,降低了成本,更在某种......
  • 【c++】vector
    vector的介绍及使用1.vector的介绍https://cplusplus.com/reference/vector/vector/vector是表示可变大小数组的序列容器就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以......
  • windows C++实现控制台应用程序隐藏后台运行
    C++实现程序隐藏后台运行,效果如下:方式一:#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")  方式二:   ......
  • C++ 继承( inheritance)
    目录一、简介:二、继承1.基础介绍:1.1、1.2继承格式介绍1.2.11.2.22.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.友元与继承6.继承与静态成员变量7.复杂的菱形继承及菱形虚拟继承8.总结:一、简介:面向对象编程(Object-OrientedProgramm......
  • 突破编程_C++_C++11新特性(智能指针与内存管理(1))
    1内存管理基础1.1什么是内存管理在C++中,内存管理是一个核心概念,它涉及到如何在程序执行过程中分配、使用和释放内存。由于C++允许程序员直接管理内存,因此内存管理在C++中显得尤为重要。合理的内存管理可以确保程序的正确运行,避免内存泄漏、野指针等问题,提高程序的......
  • P3302 [SDOI2013] 森林 题解
    题目链接:森林有意思的树上可持久化线段树变形题,建议先看这个:P2633Countonatree题解对于本题而言,我们重新阐述树上可持久化线段树的核心思想,对于点路径/边路径上的第\(k\)大问题,我们使用树上前缀和问题的思想,将其转化为可差性问题:一条路径上的权值线段树可以拆分为几棵权......