C++20新特性-barrier

 

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

 

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()` 函数等待其他线程。当所有线程都完成任务并等待其他线程时,屏障被打破,所有线程继续执行其他任务。

这个例子简单地演示了屏障的基本功能和语法。在实际应用中,你可以根据需要在屏障上执行更复杂的同步操作。
posted @ 2024-03-17 15:40  He_LiangLiang  阅读(79)  评论(0编辑  收藏  举报