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

pthread に相当するものがある同期関数 − 相互排他ロック

mutex の初期化

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;

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

mutex の削除

mutex_destroy(3THR)


#include <thread.h>

int mutex_destroy (mutex_t *mp);

mutex_destroy(3THR) は、mp が指す mutex を削除します。mutex を格納する領域は解放されません。(POSIX スレッドについては、「pthread_mutex_destroy(3THR)」を参照)

mutex の獲得

mutex_lock(3THR)


#include <thread.h>

int mutex_lock(mutex_t *mp);

mutex_lock(3THR) は、mp が指す mutex をロックします。mutex がすでにロックされている場合は、使用可能になるまで呼び出しスレッドがブロックされます (ブロック状態のスレッドは、優先順位別の待ち行列に入れられます)。(POSIX スレッドについては、「pthread_mutex_lock(3THR)」を参照)。

mutex の解除

mutex_unlock(3THR)


#include <thread.h>

int mutex_unlock(mutex_t *mp);

mutex_unlock(3THR) は、mp が指す mutex のロックを解除します。mutex はロックされていなければならず、しかも呼び出しスレッドがその mutex を最後にロックした (つまり、現在保持している) スレッドでなければなりません。(POSIX スレッドについては、「pthread_mutex_unlock(3THR)」を参照)。

mutex の獲得 (ブロックなし)

mutex_trylock(3THR)


#include <thread.h>

int mutex_trylock(mutex_t *mp);

mutex_trylock(3THR) は、mp が指す mutex をロックしようとします。この関数はブロックしない点を除いて、mutex_lock() と同じ働きをします。(POSIX スレッドについては、「pthread_mutex_trylock(3THR)」を参照)。