最終更新日時(UTC):
が更新

履歴 編集

function
<semaphore>

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

void acquire();

概要

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

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

効果

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

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

戻り値

なし

例外

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

備考

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

#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

処理系