セマフォーの操作は Solaris オペレーティング環境と POSIX 環境の両方で同じです。関数名は、Solaris オペレーティング環境で sema_ だった関数名が pthread では sem_ に変わっています。この節の内容は次のとおりです。
セマフォーの初期化
セマフォーの加算
セマフォーの値によるブロック
セマフォーの減算
セマフォーの削除
sp が指すセマフォー変数を count の値で初期化するには、sema_init(3C) を使用します。
#include <thread.h> int sema_init(sema_t *sp, unsigned int count, int type, void *arg);
type は、次のいずれかになります。
USYNC_PROCESS。セマフォーを使って、このプロセス内のスレッドとほかのプロセス内のスレッドとの間で同期をとることができます。ただし、セマフォーを初期化するプロセスは 1 つだけに制限してください。arg は無視されます。
USYNC_THREAD。セマフォーを使って、このプロセス内のスレッドの間でだけ同期をとることができます。arg は無視されます。
複数のスレッドから同時に同じセマフォーを初期化してはいけません。一度初期化したセマフォーは、ほかのスレッドが使用している可能性があるので、再初期化してはいけません。
#include <thread.h> sema_t sp; int ret; int count; count = 4; /* to be used within this process only */ ret = sema_init(&sp, count, USYNC_THREAD, 0);
#include <thread.h> sema_t sp; int ret; int count; count = 4; /* to be used among all the processes */ ret = sema_init (&sp, count, USYNC_PROCESS, 0);
sema_init() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_init() は失敗し、対応する値を返します。
EINVAL
説明:sp が無効なセマフォーを参照しています。
EFAULT
説明:sp または arg が無効なアドレスを指しています。
sp が指すセマフォーを不可分的に加算するには、sema_post(3C) を使用します。そのセマフォーでブロックされているスレッドがある場合は、そのスレッドのうちの 1 つのスレッドがブロック解除されます。
#include <thread.h> int sema_post(sema_t *sp);
sema_post() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_post() は失敗し、対応する値を返します。
EINVAL
説明:sp が無効なセマフォーを参照しています。
EFAULT
説明:sp が指すアドレスが正しくありません。
EOVERFLOW
説明:sp が指すセマフォーの値が SEM_VALUE_MAX を超えています。
sp が指すセマフォー内のカウントが 0 より大きくなるまで呼び出しスレッドをブロックするには、sema_wait(3C) を使用します。カウントが 0 より大きくなると、不可分的に減算します。
#include <thread.h> int sema_wait(sema_t *sp);
sema_wait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_wait() は失敗し、対応する値を返します。
EINVAL
説明:sp が無効なセマフォーを参照しています。
EINTR
説明:シグナルにより、待機中に割り込みが発生しました。
カウントが 0 より大きくなったとき、sp が指すセマフォー内のカウントを不可分的に減算するには、sema_trywait(3C) を使用します。この関数はブロックしない点を除いて、sema_wait() と同じ働きをします。
#include <thread.h> int sema_trywait(sema_t *sp);
sema_trywait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_trywait() は失敗し、対応する値を返します。
EINVAL
説明:sp が無効なセマフォーを参照しています。
EBUSY
説明:sp が指すセマフォーのカウントが 0 です。
sp が指すセマフォーに関連付けられた状態を削除するには、sema_destroy(3C) を使用します。セマフォーの記憶領域は解放されません。
#include <thread.h> int sema_destroy(sema_t *sp);
sema_destroy() は、正常終了時に 0 を返します。次の条件が検出された場合、sema_destroy() は失敗し、対応する値を返します。
EINVAL
説明:sp が無効なセマフォーを参照しています。