名前空間
変種
操作

std::counting_semaphore

提供: cppreference.com
< cpp‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
counting_semaphore
(C++20)
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
ヘッダ <semaphore> で定義
template<std::ptrdiff_t least_max_value = /* implementation-defined */>
class counting_semaphore;
(C++20以上)

counting_semaphore は共有リソースへのアクセスを制御できる軽量な同期プリミティブです。 std::mutex と異なり、 counting_semaphore は同じリソースに対する複数の (少なくとも least_max_value 個のスレッドによる) 並行的なアクセスを許可します。

さらに、 std::mutex と異なり、 counting_semaphore はスレッドに結び付けられません。 例えば、セマフォの取得と解放を異なるスレッドで行うことができます。 counting_semaphore に対するすべての操作は並行的に実行でき、特定のスレッドといかなる関連も持ちません。 ただし、デストラクタを並行的に実行することはできません (構築と異なるスレッドで実行することはできます)。

counting_semaphore はコンストラクタによって初期化されるカウンタを内部に持ちます。 このカウンタは acquire() およびその関連のメソッドによってデクリメントされ、 release() によってインクリメントされます。 カウンタがゼロのときは、 acquire() はカウンタがデクリメントされるまでブロックしますが、 try_acquire() はブロックしません。 try_acquire_for() および try_acquire_until() はカウンタがデクリメントされるかタイムアウトが満了するまでブロックします。

std::condition_variablewait() と同様に、 counting_semaphoretry_acquire() はスプリアスに失敗することがあり、使用に注意が必要です。

テンプレートクラス std::counting_semaphoreDefaultConstructible でも CopyConstructible でも MoveConstructible でも CopyAssignable でも MoveAssignable でもありません。

目次

[編集] メンバ関数

counting_semaphore を構築します
(パブリックメンバ関数) [edit]
counting_semaphore を破棄します
(パブリックメンバ関数) [edit]
operator=
[削除]
コピー代入可能ではありません
(パブリックメンバ関数) [edit]
操作
内部カウンタをインクリメントし、取得者のブロックを解除します
(パブリックメンバ関数) [edit]
内部カウンタをデクリメントします。 できない場合はできるまでブロックします
(パブリックメンバ関数) [edit]
ブロックせずに内部カウンタのデクリメントを試みます
(パブリックメンバ関数) [edit]
内部カウンタのデクリメントを試みます。 指定した時間ブロックします
(パブリックメンバ関数) [edit]
内部カウンタのデクリメントを試みます。 指定した時点までブロックします
(パブリックメンバ関数) [edit]

定数

[静的]
内部カウンタの可能な最大値を返します
(パブリック静的メンバ関数) [edit]

[編集] ノート

1) 非型テンプレート引数 least_max_value は非負でなければなりません。
2) その名前が示すように、 least_max_value最小の最大値であり、実際の最大値ではありません。 そのため max()least_max_value より大きな数値になることがあり、使用に注意が必要です。
3) セマフォは排他アクセスのためだけでなく通知のためにもよく使用されます。 この場合、セマフォは 0 で初期化され、送信側が release(n) を呼んで「通知する」まで、受信側が acquire() を試みてブロックします。 この点に関してセマフォは std::condition_variable の代替品と考えることができます (しばしば性能がより良いです)。 しかし、 std::condition_variable と異なり、セマフォは共有変数を持ちません。
4) std::binary_semaphorecounting_semaphore<1> に対するエイリアスですが、別々にドキュメント化しています。

[編集]