當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。