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

履歴 編集

function
<semaphore>

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

    void release(ptrdiff_t update = 1);

## 概要

カウンティングセマフォのカウンタ値に`update`を加算し、待機中スレッドのブロック解除を行う。

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

## 事前条件

`update >= 0` かつ `update <= max() - counter`

## 効果

アトミックに`counter += update`を実行し、`counter`が値`0`より大きくなるまで待機中のスレッド群をブロック解除する。

## 戻り値

なし

## 例外

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

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

## 例

    #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++: ??