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

mutex_init(3THR)


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

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

mutex_init(3THR) は、mp が指す相互排他ロック (mutex ロック) を初期化します。type には、次のいずれかを指定できます (arg は現在は無視されます)。POSIX スレッドについては、mutex の初期化を参照してください。

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

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

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

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


#include <thread.h>

mutex_t mp;
int ret;

/* このプロセスの中だけで使用する */
ret = mutex_init(&mp, USYNC_THREAD, 0); 

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


#include <thread.h>

mutex_t mp;
int ret;

/* すべてのプロセスの間で使用する */
ret = mutex_init(&mp, USYNC_PROCESS, 0); 

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


#include <thread.h>

mutex_t mp;
int ret;

/* すべてのプロセスの間で使用する */
ret = mutex_init(&mp, USYNC_PROCESS_ROBUST, 0);