【せまふぉ】
セマフォ とは?
最終更新:
💡 空いている利用枠を数え、使う処理に渡す
利用可能な許可の数を管理し、取得・解放の操作で処理を同期する仕組み。同時に使う処理の数を制限する用途などがある。許可の取得だけで、共有データのすべての競合が防げるわけではない。
📌 このページのポイント
- 取得で利用可能な許可を減らし、解放で増やす
- 許可がないときは待機・失敗・タイムアウトなどで対応する
- 同時利用数の制限や、処理間の同期に使う
- 解放漏れ・解放しすぎ・共有データの保護は別途考える
どんな仕組みなの?
3つの利用枠を用意する例を考えよう。処理が許可を1つ取得すると、空きは3から2へ減る。3つとも利用中なら空きは0で、次の処理は許可を得られるまで待つ。利用を終えて許可を返すと空きが増え、別の処理が進めるんだ。
どの場所を使うかも、セマフォが決める?
セマフォが扱うのは許可の数で、個別の場所や接続を割り当てる仕組みは別だよ。駐車場なら、空きの台数を管理する係と、どの場所に停めるかを案内する係を分けて考えるとよいね。資源のプールを使う場合も、許可の取得と具体的な資源の選択を組み合わせるんだ。
ミューテックスと同じもの?
使えば、データの競合は全部防げる?
利用数を制限することと、共有データを正しく更新することは別だよ。複数の処理を同時に通すなら、その処理同士の競合は残り得る。資源を選ぶ処理や共有変数には、必要な同期を別に設ける。取得順序や解放漏れによって、処理が進まなくなる問題にも注意しよう。
プログラムではどう使うの?
まとめ:ざっくりこれだけ覚えればOK!
「セマフォ」って出てきたら「利用できる枠の数を管理し、処理を待たせたり進めたりする仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Semaphore」 = 信号・セマフォ
💬 取得と解放をP・Vと呼ぶ表記もあるよ。APIではacquire・releaseなどの名前が使われる。