セマフォ(Semaphore)は、コンピュータサイエンスにおいて、複数のプロセスやスレッドが共有リソースにアクセスする際の同期を制御するための仕組みです。セマフォは、特に並行処理やマルチスレッドプログラミングで重要な役割を果たします。以下にセマフォの詳細を説明します。
セマフォの種類
セマフォには主に2種類あります:
- バイナリセマフォ(Binary Semaphore):
- 値が0または1のいずれかを取るセマフォです。
- ミューテックス(Mutex)とも呼ばれ、単一のリソースへの排他的アクセスを制御します。
- カウントセマフォ(Counting Semaphore):
- 任意の整数値を取ることができるセマフォです。
- 複数のリソースへのアクセスを制御するために使用されます。
セマフォの操作
セマフォには主に2つの基本操作があります:
- P操作(Wait操作):
- セマフォの値を減少させます。
- セマフォの値が0以下の場合、プロセスは待機状態になります。
- V操作(Signal操作):
- セマフォの値を増加させます。
- 待機状態のプロセスがあれば、それを再開させます。
セマフォの使用例
セマフォは、以下のようなシナリオで使用されます:
- クリティカルセクションの保護:複数のプロセスが同時にアクセスすると問題が発生する共有リソースを保護します。
- リソースの制限:例えば、データベース接続プールのように、限られた数のリソースを管理する際に使用されます。
- プロセス間通信:プロセス間での同期を取るために使用されます。
実際のコード例(Python)
以下は、Pythonでセマフォを使用する簡単な例です:
import threading
# セマフォの初期値を1に設定
semaphore = threading.Semaphore(1)
def critical_section():
semaphore.acquire()
try:
# クリティカルセクションのコード
print("クリティカルセクションに入る")
finally:
semaphore.release()
# スレッドの作成と開始
threads = [threading.Thread(target=critical_section) for _ in range(5)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
この例では、セマフォを使用して複数のスレッドが同時にクリティカルセクションに入らないように制御しています。