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()來停止執行,直到所有其他線程都到達屏障。一旦所有線程都到達,屏障就會解除,所有線程都會被釋放以恢複執行。完成後,控製台顯示消息“所有線程已完成。”。
相關用法
- C++20 std::endian用法及代碼示例
- C++ cos()用法及代碼示例
- C++ sin()用法及代碼示例
- C++ asin()用法及代碼示例
- C++ atan()用法及代碼示例
- C++ atan2()用法及代碼示例
- C++ acos()用法及代碼示例
- C++ tan()用法及代碼示例
- C++ sinh()用法及代碼示例
- C++ ceil()用法及代碼示例
- C++ tanh()用法及代碼示例
- C++ fmod()用法及代碼示例
- C++ acosh()用法及代碼示例
- C++ asinh()用法及代碼示例
- C++ floor()用法及代碼示例
- C++ atanh()用法及代碼示例
- C++ log()用法及代碼示例
- C++ trunc()用法及代碼示例
- C++ round()用法及代碼示例
- C++ lround()用法及代碼示例
- C++ llround()用法及代碼示例
- C++ rint()用法及代碼示例
- C++ lrint()用法及代碼示例
- C++ log10()用法及代碼示例
- C++ modf()用法及代碼示例
注:本文由純淨天空篩選整理自mukulsomukesh大神的英文原創作品 std::barrier in C++20。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。