マルチスレッドのプログラミング

pthread に相当するものがある同期関数 — セマフォー

セマフォーの操作は Solaris オペレーティング環境と POSIX 環境の両方で同じです。関数名は、Solaris オペレーティング環境で sema_ だった関数名が pthread では sem_ に変わっています。この節の内容は次のとおりです。

セマフォーの初期化

sp が指すセマフォー変数を count の値で初期化するには、sema_init(3C) を使用します。

sema_init の構文

#include <thread.h>

int sema_init(sema_t *sp, unsigned int count, int type,
    void *arg);

type は、次のいずれかになります。

複数のスレッドから同時に同じセマフォーを初期化してはいけません。一度初期化したセマフォーは、ほかのスレッドが使用している可能性があるので、再初期化してはいけません。

プロセス内スコープでのセマフォー

#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 の戻り値

sema_init() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_init() は失敗し、対応する値を返します。


EINVAL

説明:

sp が無効なセマフォーを参照しています。


EFAULT

説明:

sp または arg が無効なアドレスを指しています。

セマフォーの加算

sp が指すセマフォーを不可分的に加算するには、sema_post(3C) を使用します。そのセマフォーでブロックされているスレッドがある場合は、そのスレッドのうちの 1 つのスレッドがブロック解除されます。

sema_post の構文

#include <thread.h>

int sema_post(sema_t *sp);

sema_post の戻り値

sema_post() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_post() は失敗し、対応する値を返します。


EINVAL

説明:

sp が無効なセマフォーを参照しています。


EFAULT

説明:

sp が指すアドレスが正しくありません。


EOVERFLOW

説明:

sp が指すセマフォーの値が SEM_VALUE_MAX を超えています。

セマフォーの値によるブロック

sp が指すセマフォー内のカウントが 0 より大きくなるまで呼び出しスレッドをブロックするには、sema_wait(3C) を使用します。カウントが 0 より大きくなると、不可分的に減算します。

sema_wait の構文

#include <thread.h>

int sema_wait(sema_t *sp);

sema_wait の戻り値

sema_wait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_wait() は失敗し、対応する値を返します。


EINVAL

説明:

sp が無効なセマフォーを参照しています。


EINTR

説明:

シグナルにより、待機中に割り込みが発生しました。

セマフォーの減算

カウントが 0 より大きくなったとき、sp が指すセマフォー内のカウントを不可分的に減算するには、sema_trywait(3C) を使用します。この関数はブロックしない点を除いて、sema_wait() と同じ働きをします。

sema_trywait の構文

#include <thread.h>

int sema_trywait(sema_t *sp);

sema_trywait の戻り値

sema_trywait() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、sema_trywait() は失敗し、対応する値を返します。


EINVAL

説明:

sp が無効なセマフォーを参照しています。


EBUSY

説明:

sp が指すセマフォーのカウントが 0 です。

セマフォーの削除

sp が指すセマフォーに関連付けられた状態を削除するには、sema_destroy(3C) を使用します。セマフォーの記憶領域は解放されません。

sema_destroy(3C) の構文

#include <thread.h>

int sema_destroy(sema_t *sp);

sema_destroy(3C) の戻り値

sema_destroy() は、正常終了時に 0 を返します。次の条件が検出された場合、sema_destroy() は失敗し、対応する値を返します。


EINVAL

説明:

sp が無効なセマフォーを参照しています。