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).