スポンサーリンク

SEMA(9) FreeBSD カーネル開発者マニュアル SEMA(9)

名称

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

書式

#include <sys/types.h>
#include <sys/lock.h>
#include <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() を使用して作成されます。ここで semastruct 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)

FreeBSD 10.0 June 14, 2004 FreeBSD 10.0

スポンサーリンク