#include <synch.h> (または #include <thread.h>) int mutex_init(mutex_t *mp, int type, void *arg)); |
mutex_init(3T) は、mp が指す相互排他ロック (mutex ロック) を初期化します。type には、次のいずれかを指定できます (arg は現在は無視されます)。(POSIX スレッドについては、「mutex の初期化」を参照)。
USYNC_PROCESS ロックした状態でプロセスが終了すると、次にそのロックを要求したスレッドは滞ります。これは、クライアントプロセスとロックを共有するシステムで起こる問題で、クライアントプロセスが強制的に終了されることがあり得るからです。ロックしたままプロセスが終了する問題を回避するには、USYNC_PROCESS_ROBUST で mutex をロックします。USYNC_PROCESS_ROBUST には次の 2 つの機能があります。
プロセスが終了するときに、そのプロセスで獲得されたロックをすべて解除します。
強制終了されたプロセスが獲得したロックを次に要求するスレッドは、そのロックと共に、エラーを受け取ります。エラーは、前にロックを獲得していたスレッドがロックしたまま終了したことを示します。
0 に初期化されたメモリーに領域を確保することによって mutex を初期化することもできます。その場合は type に USYNC_THREAD を指定したものと仮定されます。
複数のスレッドから同じ mutex を同時に初期化してはいけません。一度初期化した mutex は、他のスレッドが使用している可能性があるので再初期化してはいけません。
#include <thread.h> mutex_t mp; int ret; /* このプロセスの中だけで使用する */ ret = mutex_init(&mp, USYNC_THREAD, 0); |
#include <thread.h> mutex_t mp; int ret; /* すべてのプロセスの間で使用する */ ret = mutex_init(&mp, USYNC_PROCESS, 0); |
#include <thread.h> mutex_t mp; int ret; /* to be used among all processes */ ret = mutex_init(&mp, USYNC_PROCESS_ROBUST, 0); |