セマフォの操作は Solaris と POSIX で同じです。関数名は、Solaris で sema_ だったものが pthread では sem_ に変わっています。
#include <thread.h> int sema_init(sema_t *sp, unsigned int count, int type, void *arg);
sema_init() は、sp が指すセマフォ変数に count の値を初期設定します。type には、次のいずれかを指定できます (arg は現在は無視されます)。
USYNC_PROCESS: 現在のプロセス内のスレッドと他のプロセス内のスレッドとの間で同期をとることができるようにします。ただし、セマフォを初期化するプロセスは 1 つだけに制限してください。arg は無視されます。
USYNC_THREAD: 現在のプロセス内のスレッドの間でだけ同期をとることができるようにします。arg は無視されます。
複数のスレッドから同じセマフォを同時に初期化してはいけません。一度初期化したセマフォは他のスレッドが使用している可能性があるので、再初期化してはいけません。
#include <thread.h> sema_t sp; int ret; int count; count = 4; /* このプロセスの中だけで使用する */ ret = sema_init(&sp, count, USYNC_THREAD, 0);
#include <thread.h> sema_t sp; int ret; int count; count = 4; /* すべてのプロセスの間で使用する */ ret = sema_init (&sp, count, USYNC_PROCESS, 0);
#include <thread.h> int sema_post(sema_t *sp);
sema_post() は、sp が指すセマフォの値を原子的操作によって 1 増やします。そのセマフォでブロックされているスレッドがある場合は、そのスレッドのうちの 1 つのスレッドがブロック解除されます。
#include <thread.h> int sema_wait(sema_t *sp);
sema_wait() は、sp が指すセマフォの値が、0 より大きくなるまでスレッドをブロックし、0 より大きくなったらセマフォの値を原子的操作によって 1 減らします。
#include <thread.h> int sema_trywait(sema_t *sp);
sema_trywait() は、sp が指すセマフォの値が 0 より大きい場合、原子的操作によって 1 減らします。この関数はブロックしない点を除いて、sema_wait() と同じ働きをします。
#include <thread.h> int sema_destroy(sema_t *sp);
sema_destroy() は、sp が指すセマフォを削除します。セマフォを格納する領域は解放されません。