TL;DR

プロセスやスレッドが、共有リソースに並行してアクセスできる数を制御する仕組み。アクセス数が上限に達すると、新しいアクセス要求は待機する。

仕組み

ミューテックスがアクセスを 1 つのプロセスやスレッドにしか許さないのに対し、セマフォは任意の数(N)まで許す。N = 1 のセマフォはバイナリセマフォと呼ばれ、ミューテックスと同じ働きをする。

例

Go では、拡張パッケージの golang.org/x/sync/semaphore でセマフォを使える。セマフォ(Weighted)は、アクセスできる共有リソースの数を内部に持っている。そのため、待機しているゴルーチンがいなくてもリソースを先に解放でき、後から来たゴルーチンがそのリソースを使える。一方、条件変数(sync.Cond)の Signal() は、待機しているゴルーチンがいなければ通知が伝わらない。

注意点

バイナリセマフォとミューテックスは同じものではない。ミューテックスは排他制御のためのロックで、所有権の概念がある。そのため、ミューテックスはそれを持っているプロセスやスレッドが解放しなければならない。セマフォには所有権の概念がなく、どのプロセスやスレッドでも解放できる。

関連

出典