SEMAPHORES(3) |
FreeBSD Library Functions Manual |
SEMAPHORES(3) |
名前
sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, sem_destroy -セマフォの操作
書式
#include <semaphore.h>
int sem_init(sem_t *
sem
, int
pshared
, unsigned int
value
);
int sem_wait(sem_t *
sem
);
int sem_trywait(sem_t *
sem
);
int sem_post(sem_t *
sem
);
int sem_getvalue(sem_t *
sem
, int *
sval
);
int sem_destroy(sem_t *
sem
);
説明
このマニュアルページは POSIX 1003.1b のセマフォについて記述しており、
ipc(5) や
semctl(2) 、
semop(2) に記述されている SystemV セマフォと混同してはならない。
セマフォはスレッド間で共有される資源を管理するためのカウンタである。セマフォに関する基本的な操作は次の 2 つである: カウンタを一息で 1 だけ増加させることと、カウンタが 0 でなくなるまで待ったあと一息で 1 だけ減少させることである。
sem_init は
sem で指定されるセマフォオブジェクトを初期化する。セマフォに結び付けられるカウントは
value に初期化される。引数
pshared はセマフォが現在のプロセスだけで有効 (
pshared が 0) か複数のプロセスで共有される (
pshared が非 0) かを指定する。LinuxThreads は現在のところプロセス間共有セマフォはサポートしていない。そのため、
pshared が 0 でない場合は、
sem_init は常にエラー
ENOSYS を返す。
sem_wait は、
sem で指定されるセマフォのカウントが非 0 になるまで呼び出しスレッドの実行を停止する。そしてセマフォカウントを一息で 1 だけ減少させる。
sem_trywait はブロックをともなわない
sem_wait である。
sem で指定されるセマフォのカウントが非 0 の場合には一息でカウントが 1 だけ減少されて
sem_trywait は直ちに 0 を返す。セマフォカウントが 0 の場合には
sem_trywait は直ちにエラー
EAGAIN を返す。
sem_post は
sem で指定されるセマフォのカウントを一息で 1 だけ増加させる。この関数は決してブロックすることはなく、非同期シグナルハンドラの中でも安全に使用することができる。
sem_getvalue は
sval で指し示される領域にセマフォ
sem の現在のカウントを格納する。
sem_destroy はセマフォオブジェクトを破壊し、セマフォオブジェクトが保持していた資源を解放する。
sem_destroy が呼び出されるときにそのセマフォを獲得待ちしているスレッドがあってはならない。 LinuxThreads の実装では、セマフォオブジェクトは何も資源を保持しないため、
sem_destroy はそのスレッドを獲得待ちしているスレッドがないことをチェックする以外に何もしない。
取り消し
sem_wait は取り消しポイントである。
非同期シグナルの安全性
不可分の比較交換命令 (compare-and-swap) をサポートしている CPU (Intel 486 や Pentium およびその後継、 Alpha 、 PowerPC 、 MIPS II 、 Motorola 68k) では、関数
sem_post は非同期シグナルに対して安全であり、そのためシグナルハンドラから呼び出すことが可能である。
sem_post は、非同期シグナルに対して安全な、 POSIX スレッドで提供される唯一のスレッド同期関数である。
Intel 386 と Sparc においては、現時点の LinuxThreads の実装では
sem_post は非同期シグナルに対して安全でない。これは必要な不可分命令が存在しないからである。
返り値
関数
sem_wait および
sem_getvalue は常に 0 を返す。他のセマフォ関数はすべて、成功すると 0 を返し、エラーならば -1 を返してエラーコードを
errno に格納する。
エラー
関数
sem_init はエラーの場合に次のようなエラーコードを
errno に格納する。
-
EINVAL
-
value がカウンタの最大値
SEM_VALUE_MAX を超えている。
-
ENOSYS
-
pshared が 0 でない。
関数
sem_trywait はエラーの場合に次のようなエラーコードを
errno に格納する。
-
EAGAIN
-
現時点のセマフォカウントが 0 である。
関数
sem_post はエラーの場合に次のようなエラーコードを
errno に格納する。
-
ERANGE
-
カウンタを増加すると、セマフォの値が
SEM_VALUE_MAX を超えてしまう (この場合、セマフォカウントは変更されない) 。
関数
sem_destroy はエラーの場合に次のようなエラーコードを
errno に格納する:
-
EBUSY
-
指定したセマフォの獲得待ちでブロックされているスレッドがある。
著者
Xavier Leroy <Xavier.Leroy@inria.fr>
関連事項
pthread_mutex_init(3),
pthread_cond_init(3),
pthread_cancel(3),
ipc(5).