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

履歴 編集

function
<semaphore>

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

bool try_acquire() noexcept;

概要

カウンティングセマフォのカウンタ値が0の場合は何もせずfalseを返し、そうでなければカウンタ値を1つ減算してtrueを返す。

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

効果

counter > 0の場合は、呼び出しスレッドをブロッキングすることなく、アトミックにcounter -= 1を実行する。 counterが減算されなかった場合は、副作用は発生せずtry_acquire関数は即座に呼び出し元へ戻る。

処理系には、counter > 0であってもcounterの減算に失敗することが許容される。 ただし、セマフォに対する操作が競合していない状況下において、try_acquireが一貫してfalseを返すような実装は許容されない。 (Spurious Failure が生じることは滅多にないが、これによりアトミック変数を用いる単純な Compare-and-Exchange ベースの興味深い実装が許容される。)

戻り値

counterが減算された場合はtrueを返し、そうでなければfalseを返す。

例外

投げない

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

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

  std::thread t([&]{
    // 通知を待機し、共有データから読取り
    while (!sem.try_acquire()) {
      std::this_thread::yield();
      // ここでは try_acquire 動作例示のためビジーループを行うが、
      // セマフォ待機が目的であれば acquire() 利用が適切である。
    }
    std::cout << shared_data << std::endl;
  });

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

  t.join();
}

出力

42

バージョン

言語

  • C++20

処理系