C++ 庫 - <latch>



C++20 中的<latch> 標頭檔案是一個一次性使用的同步原語,它確保一組執行緒等待直到滿足預定義的條件。一旦滿足此條件,所有等待的執行緒都將被處理。與 barrier 不同,latch 使用後不會重置。

<latch> 使用給定的計數進行構造,每個執行緒呼叫 count_down() 函式來減少內部計數器。當計數器達到零時,所有等待 latch 的執行緒都將被釋放。如果執行緒在 latch 準備好之前嘗試呼叫 wait(),它將阻塞直到計數器達到零。

包含 <latch> 標頭檔案

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

#include <latch>

<latch> 標頭檔案的函式

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

序號 函式及描述
1 count_down

將內部計數器遞減 1。

2 try_wait

測試內部計數器是否等於零。

3 wait

阻塞直到計數器達到零。

4 arrive_and_wait

遞減計數器並阻塞直到它達到零。

5 max

返回實現支援的內部計數器的最大值。

帶多個計數的 Latch

在下面的示例中,我們將使用 latch 用於兩個“A”。每個“A”在完成時遞減 latch,主執行緒等待直到兩個“A”都完成然後列印一條訊息。

#include <iostream>
#include <thread>
#include <latch>
void a(int b, std::latch & latch) {
   std::cout << "A" << b << " Is Starting..\n";
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "A" << b << " Finished Work.!\n";
   latch.count_down();
}
int main() {
   std::latch latch(2);
   std::thread x1(a, 1, std::ref(latch));
   std::thread x2(a, 2, std::ref(latch));
   latch.wait();
   std::cout << "Work Is Done..\n";
   x1.join();
   x2.join();
   return 0;
}

輸出

以上程式碼的輸出如下:

A1 Is Starting..
A2 Is Starting..
A1 Finished Work.!
A2 Finished Work.!
Work Is Done..
廣告