セマフォとは、コンピュータ科学において、複数のプログラムが共有する資源へのアクセスを制御するための変数または抽象データ型です。オランダ人計算機科学者エドガー・ダイクストラによって考案されました。

セマフォは、信号機のような役割を果たします。信号機が赤の場合は、車が交差点に進入できません。同様に、セマフォの値が0の場合は、プログラムは資源にアクセスできません。

セマフォには、主に以下の2つの操作があります。

  • P操作: セマフォの値を1減らします。値が0以下になると、プログラムはブロックされます。
  • V操作: セマフォの値を1増やします。ブロックされているプログラムがあれば、1つだけ実行可能になります。

セマフォを使用することで、複数のプログラムが共有する資源を安全に管理することができます。

セマフォの主な用途

  • 排他制御: 複数のプログラムが同時に同じ資源にアクセスしようとすると、データ競合が発生する可能性があります。セマフォを使用することで、排他制御を行い、データ競合を防ぐことができます。
  • 同期: 複数のプログラムが互いに協調して動作する必要がある場合、セマフォを使用して同期することができます。

セマフォの種類

セマフォの実装

セマフォは、オペレーティングシステムによって提供されます。プログラムは、オペレーティングシステムAPIを使用して、セマフォを作成、操作、破棄することができます。

セマフォの例

以下は、セマフォを使用して排他制御を行う例です。

# セマフォを作成
semaphore = threading.Semaphore()

def thread_1():
    # セマフォを獲得
    semaphore.acquire()

    # 資源を使用
    ...

    # セマフォを解放
    semaphore.release()

def thread_2():
    # セマフォを獲得
    semaphore.acquire()

    # 資源を使用
    ...

    # セマフォを解放
    semaphore.release()

# スレッド1とスレッド2を起動
thread_1.start()
thread_2.start()

この例では、2つのスレッドが同じ資源を使用しようとしています。セマフォを使用することで、2つのスレッドが同時に資源を使用することはできません。

セマフォは、並行プログラミングにおいて非常に重要な概念です。セマフォを使用することで、複数のプログラムが共有する資源を安全に管理することができます。