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

mutex の初期化

mp が指す mutex を初期化するには、mutex_init(3C) を使用します。POSIX スレッドの場合については、「mutex の初期化」を参照してください。

mutex_init(3C) の構文

#include <synch.h> 
#include <thread.h>

int mutex_init(mutex_t *mp, int type, void *arg)); 

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

USYNC_PROCESS ロックした状態でプロセスが異常終了すると、次にそのロックを要求したスレッドは滞ります。これは、クライアントプロセスとロックを共有するシステムで起こる問題で、クライアントプロセスが強制的に終了されることがあり得るからです。ロックしたままプロセスが終了する問題を回避するには、USYNC_PROCESS_ROBUST で mutex をロックします。USYNC_PROCESS_ROBUST には次の 2 つの機能があります。

0 に初期化されたメモリーに領域を確保することによって mutex を初期化することもできます。その場合は typeUSYNC_THREAD を指定したものと仮定されます。

複数のスレッドから同じ mutex を同時に初期化してはいけません。相互排他ロックは、ほかのスレッドで使われている可能性があるので再初期化してはいけません。

プロセス内スコープでの mutex

#include <thread.h>

mutex_t mp;
int ret;

/* to be used within this process only */
ret = mutex_init(&mp, USYNC_THREAD, 0); 

プロセス間スコープでの mutex

#include <thread.h>

mutex_t mp;
int ret;

/* to be used among all processes */
ret = mutex_init(&mp, USYNC_PROCESS, 0); 

プロセス間スコープの確実な mutex

#include <thread.h>

mutex_t mp;
int ret;

/* to be used among all processes */
ret = mutex_init(&mp, USYNC_PROCESS_ROBUST, 0); 

mutex_init の戻り値

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


EFAULT

説明:

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


EINVAL

説明:

mpで指定された値が無効です。


ENOMEM

説明:

mutex の初期化に必要なメモリーが不足しています。


EAGAIN

説明:

mutex の初期化に必要なリソースが不足しています。


EBUSY

説明:

アクティブな mutex の再初期化を試行していることが検出されました。