C++ 庫 - <barrier>



C++20 中的<barrier>有助於在併發程式設計中協調多個執行緒的執行。它使執行緒能夠在共同點或屏障處相互等待,然後再繼續執行。當所有執行緒到達屏障時,它們將被釋放以執行其任務。

屏障物件初始化為特定數量的參與執行緒,稱為完成階段。當每個執行緒完成其任務併到達屏障時,它將呼叫 arrive_and_wait() 函式。

包含 <barrier> 標頭檔案

要在您的 C++ 程式中包含 <barrier> 標頭檔案,可以使用以下語法。

#include <barrier>

<barrier> 標頭檔案的函式

以下是 <barrier> 標頭檔案中所有函式的列表。

序號 函式及描述
1 arrive

到達屏障並減少預期計數。

2 wait

在階段同步點阻塞,直到其階段完成步驟執行。

3 arrive_and_wait

到達屏障並將預期計數減少 1,然後阻塞直到當前階段完成。

4 arrive_and_drop

將後續階段的初始預期計數和當前階段的預期計數都減少 1。

5 max

返回實現支援的預期計數的最大值。

使用 arrive_and_wait()

在以下示例中,我們將為兩個執行緒建立一個屏障,它們將在繼續執行之前相互等待。

std:barrier 類是在 C++20 中引入的,因此要執行此程式碼,編譯器必須支援 C++20。

#include <iostream>
#include <barrier>
#include <thread>
void x(std::barrier < > & sync_point, int id) {
   std::cout << "Thread " << id << " has reached the barrier.\n";
   sync_point.arrive_and_wait();
   std::cout << "Thread " << id << " has crossed the barrier.\n";
}
int main() {
   std::barrier sync_point(2);
   std::thread t1(x, std::ref(sync_point), 1);
   std::thread t2(x, std::ref(sync_point), 2);
   t1.join();
   t2.join();
   return 0;
}

輸出

以下是上述程式碼的輸出:

Thread 2 has reached the barrier.
Thread 1 has reached the barrier.
Thread 1 has crossed the barrier.
Thread 2 has crossed the barrier.
廣告