【せまふぉ】

セマフォ とは?

最終更新:
💡 空いている利用枠を数え、使う処理に渡す

利用可能な許可の数を管理し、取得・解放の操作で処理を同期する仕組み。同時に使う処理の数を制限する用途などがある。許可の取得だけで、共有データのすべての競合が防げるわけではない。

📌 このページのポイント
セマフォ:利用枠は3つ3枠を利用中 → 空きは0次の処理は許可を待つ利用中の枠ABC取得 acquire空きがあれば −1解放 release利用を終えて +1空き数の管理と、データの保護は別
駐車場にたとえた同時利用数の制御。3枠を使用中なので空きは0。個別の資源の割り当てや、共有データの同期は別に考えます。
ひよこ ひよこ
どんな仕組みなの?
ペンギン先生 ペンギン先生
3つの利用枠を用意する例を考えよう。処理が許可を1つ取得すると、空きは3から2へ減る。3つとも利用中なら空きは0で、次の処理は許可を得られるまで待つ。利用を終えて許可を返すと空きが増え、別の処理が進めるんだ。
ひよこ ひよこ
どの場所を使うかも、セマフォが決める?
ペンギン先生 ペンギン先生
セマフォが扱うのは許可の数で、個別の場所や接続を割り当てる仕組みは別だよ。駐車場なら、空きの台数を管理する係と、どの場所に停めるかを案内する係を分けて考えるとよいね。資源のプールを使う場合も、許可の取得と具体的な資源の選択を組み合わせるんだ。
ひよこ ひよこ
ミューテックスと同じもの?
ペンギン先生 ペンギン先生
許可を1つにして排他に使うバイナリセマフォもあるけれど、ミューテックスと同一とは限らないよ。たとえばJavaのSemaphoreは取得したスレッド以外からも解放でき、所有者という概念を持たない。ロックの所有者や再入可能性などの規則は、使うAPIで確認するんだ。
ひよこ ひよこ
使えば、データの競合は全部防げる?
ペンギン先生 ペンギン先生
利用数を制限することと、共有データを正しく更新することは別だよ。複数の処理を同時に通すなら、その処理同士の競合は残り得る。資源を選ぶ処理や共有変数には、必要な同期を別に設ける。取得順序や解放漏れによって、処理が進まなくなる問題にも注意しよう。
ひよこ ひよこ
プログラムではどう使うの?
ペンギン先生 ペンギン先生
たとえばPythonのthreading.BoundedSemaphore(3)で利用枠を3つにし、withの範囲で許可を取得して処理する方法があるよ。接続などの資源自体も確実に閉じよう。BoundedSemaphoreは解放しすぎを検出する。待つ順序やタイムアウトの扱いはAPIによるので、枠の数だけで安全を保証するものではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「セマフォ」って出てきたら「利用できる枠の数を管理し、処理を待たせたり進めたりする仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Semaphore」 = 信号・セマフォ
💬 取得と解放をP・Vと呼ぶ表記もあるよ。APIではacquire・releaseなどの名前が使われる。

参考資料

← 用語集にもどる