SEMA(9)

名称
sema, sema_init, sema_destroy, sema_post, sema_wait, sema_timedwait, sema_trywait, sema_value - カーネル計数セマフォ

書式
<sys/types.h> <sys/lock.h> <sys/sema.h> void sema_init(struct sema *sema, int value, const char *description) void sema_destroy(struct sema *sema) void sema_post(struct sema *sema) void sema_wait(struct sema *sema) int sema_timedwait(struct sema *sema, int timo) int sema_trywait(struct sema *sema) int sema_value(struct sema *sema)

解説
計数セマフォはリソースのプールへのアクセスの同期のための 仕組みを提供します。 mutex とは違い、セマフォは所有者の概念は持っていないため、 1 つのスレッドがリソースの獲得を必要とし、別のスレッドがそのリソースの 開放を必要とするような状況でも、利用できます。 各々のセマフォは、それに関連付けられた整数値を持っています。 ポスト (インクリメント) は常に成功しますが、ウェイト (デクリメント) は そのセマフォの値が 0 以上になる場合にのみ、成功して完了することが可能です。

セマフォは mutex と状態変数で十分であるようなところでは使用するべきでは ありません。 セマフォは mutex と状態変数より複雑な同期の仕組みですので、 そのため効率的ではありません。

セマフォは sema_init() を使用して作成されます。 ここで sema は struct sema のための領域へのポインタで、 value はセマフォの初期値で、 description はそのセマフォを説明するヌルで終端された文字列へのポインタです。 セマフォは sema_destroy() を使用して破壊されます。 セマフォは sema_post() を使用してポスト (インクリメント) されます。 セマフォは sema_wait(), sema_timedwait() または sema_trywait() を使用してウェイト (デクリメント) されます。 sema_timedwait() への timo 引数は失敗して戻る前にウェイトするための tick 単位での最小時間を指定します。 sema_value() はセマフォの現在の値を読み出すために使用されます。

戻り値
sema_value() 関数は現在のセマフォの値を返します。

セマフォのデクリメントによりその値が負になった場合には、 sema_trywait() は失敗を示すために 0 を返します。 そうでない場合には、成功を示すために 0 ではない値が返されます。

sema_timedwait() 関数はそのセマフォ上でのウェイトが成功した場合には 0 を返し、 そうでない場合には 0 ではないエラーコードが返されます。

エラー
sema_timedwait() 関数は以下の場合に失敗します。

[EWOULDBLOCK]
    タイムアウトしました。

関連項目
condvar(9), mtx_pool(9), mutex(9), sx(9)