C++ 庫 - <semaphore>



在 C++20 中,<semaphore> 標頭檔案用於透過多個執行緒控制對共享資源的訪問。它用於限制同時訪問某個部分或共享資源的執行緒數量的場景。

<semaphore> 可以處於兩種狀態:二進位制訊號量或計數訊號量。其中,binary_semaphore 允許單個執行緒一次訪問一個資源,而 counting_semaphore 允許最多一定數量的執行緒訪問。當計數達到零時,其他執行緒會被阻塞,直到計數再次大於零。

counting_semaphore 持有一個整數值,而 binary_semaphore 僅限於 0 或 1。

包含 <semaphore> 標頭檔案

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

#include <semaphore>

<semaphore> 標頭檔案的函式

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

序號 函式及描述
1 release

它遞增內部計數器並解除阻塞獲取者。

2 acquire

它遞減內部計數器或阻塞直到可以遞減。

3 try_acquire

它嘗試遞減內部計數器而不阻塞。

4 try_acquire_for

它嘗試遞減內部計數器,阻塞最多持續時間。

5 try_acquire_until

它嘗試遞減內部計數器,阻塞直到某個時間點。

5 max

它返回內部計數器的最大可能值。

控制訪問

在以下示例中,我們將使用計數訊號量將對共享資源的訪問限制為一次最多兩個執行緒。

#include <iostream>
#include <semaphore>
#include <thread>
std::counting_semaphore < 2 > sem(2);
void a(int b) {
   sem.acquire();
   std::cout << "A" << b << " Accessing Resource.\n";
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "A" << b << " Releasing Resource.\n";
   sem.release();
}
int main() {
   std::thread x1(a, 1);
   std::thread x2(a, 2);
   std::thread x3(a, 3);
   x1.join();
   x2.join();
   x3.join();
   return 0;
}

輸出

以上程式碼的輸出如下:

A1 Accessing Resource.
A2 Accessing Resource.
A1 Releasing Resource.
A3 Accessing Resource.
A2 Releasing Resource.
A3 Releasing Resource.
廣告