SEMAPHORES

Section: C Library Functions (3)
Updated: LinuxThreads
IndexJM Home Page

 

名前

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_initsemで指定されるセマフォオブジェクトを初期化する。 セマフォに結び付けられるカウントは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_postsemで指定されるセマフォのカウントを一息で 1 だけ増加させる。 この関数は決してブロックすることはなく、 非同期シグナルハンドラの中でも安全に使用することができる。

sem_getvaluesvalで指し示される領域に セマフォ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).


関連キーワード

sem,セマフォ,カウント,エラー,int,シグナル,init,非同期,SEMAPHORES,wait 

Index

名前
書式
説明
取り消し
非同期シグナルの安全性
返り値
エラー
著者
関連事項

This document was created byman2html, using the manual pages.
Time: 15:49:14 GMT, July 11, 2021