EN JA
SEMA(9)
SEMA(9) FreeBSD Kernel Developer's Manual 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 以上である場合のみ、ウェート (デクリメント) は、成功して完了することができます。

セマフォは、ミューテックと状態変数が十分であるところで、使用されるべきではありません。セマフォは、ミューテックと状態変数より複雑な同期メカニズムで、効率的ではありません。

セマフォは、 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]
タイムアウトは、満了しました。
February 1, 2006 FreeBSD