最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<semaphore>

# std::counting_semaphore::acquire(C++20)

    void acquire();

## 概要

カウンティングセマフォのカウンタ値が`0`より大きくなるまで待機し、カウンタ値を`1`だけ減算してから制御を戻す。

説明のため、ここではカウンタ値を`counter`と表記する。

## 効果

次のステップを繰り返す：

- `try_acquire`を評価し、結果が`true`ならば関数呼び出し元へ制御を戻す。
- `counter`が`0`より大きくなるまで、`*this`上で関数呼び出しスレッドをブロッキングする。

## 戻り値

なし

## 例外

この関数は、以下のerror conditionを持つ`system_error` 例外オブジェクトを送出する可能性がある：

- `resource_unavailable_try_again` : 操作対象のネイティブハンドル型が無効
- `operation_not_permitted` : スレッドにこの操作を行う権限がない

## 備考

「効果」欄では`acquire`メンバ関数の振る舞いを手続き的に説明しているが、実際の処理系においてはオペレーティングシステムが提供する効率的なセマフォ操作関数が利用されると期待される。

- POSIXセマフォでは`sem_wait`関数が提供される。
- Windowsセマフォでは`WaitForSingleObject`関数ファミリが提供される。

## 例

    #include <iostream>
    #include <semaphore>
    #include <thread>

    int main()
    {
      int shared_data = 0;
      std::counting_semaphore sem{0};

      std::thread t([&]{
        // 通知を待機し、共有データから読取り
        sem.acquire();
        std::cout << shared_data << std::endl;
      });

      // 共有データへ書込み、通知を行う
      shared_data = 42;
      sem.release();

      t.join();
    }

### 出力

    42

## バージョン

### 言語

- C++20

### 処理系

- Clang: 11.0 ✅
- GCC: ??
- ICC: ??
- Visual C++: ??