mutex の初期化
mutex の削除
mutex の獲得
mutex の解除
mutex の獲得の試行
mp が指す mutex を初期化するには、mutex_init(3C) を使用します。POSIX スレッドの場合については、「mutex の初期化」を参照してください。
#include <synch.h> #include <thread.h> int mutex_init(mutex_t *mp, int type, void *arg));
type は、次のいずれかになります。
USYNC_PROCESS — mutex を使って、このプロセス内のスレッドとほかのプロセス内のスレッドとの間で同期をとることができます。arg は無視されます。
USYNC_PROCESS_ROBUST — mutex を使って、このプロセス内のスレッドとほかのプロセス内のスレッドとの間で確実に同期をとることができます。arg は無視されます。
USYNC_THREAD — mutex を使って、このプロセス内のスレッドの間でだけ同期をとることができます。arg は無視されます。
USYNC_PROCESS ロックした状態でプロセスが異常終了すると、次にそのロックを要求したスレッドは滞ります。これは、クライアントプロセスとロックを共有するシステムで起こる問題で、クライアントプロセスが強制的に終了されることがあり得るからです。ロックしたままプロセスが終了する問題を回避するには、USYNC_PROCESS_ROBUST で mutex をロックします。USYNC_PROCESS_ROBUST には次の 2 つの機能があります。
プロセスが終了するときに、そのプロセスで獲得されたロックをすべて解除します。
異常終了したプロセスが獲得したロックを次に要求するスレッドは、そのロックを受け取ります。このロックを受け取るときに、前にロックを獲得していたスレッドがロックしたまま終了したことを示すエラーコードも受け取ります。
0 に初期化されたメモリーに領域を確保することによって mutex を初期化することもできます。その場合は type に USYNC_THREAD を指定したものと仮定されます。
複数のスレッドから同じ mutex を同時に初期化してはいけません。相互排他ロックは、ほかのスレッドで使われている可能性があるので再初期化してはいけません。
#include <thread.h> mutex_t mp; int ret; /* to be used within this process only */ ret = mutex_init(&mp, USYNC_THREAD, 0);
#include <thread.h> mutex_t mp; int ret; /* to be used among all processes */ 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);
mutex_init() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、mutex_init() は失敗し、対応する値を返します。
EFAULT
説明:mp が指すアドレスが正しくありません。
EINVAL
説明:mpで指定された値が無効です。
ENOMEM
説明:mutex の初期化に必要なメモリーが不足しています。
EAGAIN
説明:mutex の初期化に必要なリソースが不足しています。
EBUSY
説明:アクティブな mutex の再初期化を試行していることが検出されました。
mp が指す mutex に関連付けられた状態を削除するには、mutex_destroy(3C) を使用します。mutex の記憶領域は解放されません。POSIX スレッドの場合については、「pthread_mutex_destroy の構文」を参照してください。
#include <thread.h> int mutex_destroy (mutex_t *mp);
mutex_destroy() は、正常終了時に 0 を返します。次の条件が検出された場合、mutex_destroy() は失敗し、対応する値を返します。
EFAULT
説明:mp が指すアドレスが正しくありません。
mp が指す mutex をロックするには、mutex_lock(3C) を使用します。mutex がすでにロックされている場合、呼び出しスレッドは mutex が使用可能になるまでブロックされます。ブロックされたスレッドは、優先順位の高いキューで待機します。POSIX スレッドの場合については、「pthread_mutex_lock の構文」を参照してください。
#include <thread.h> int mutex_lock(mutex_t *mp);
mutex_lock() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、mutex_lock() は失敗し、対応する値を返します。
EFAULT
説明:mp が指すアドレスが正しくありません。
EDEADLK
説明:mutex はすでにロックされていて、呼び出しスレッドに保持されています。
mp が指す mutex のロックを解除するには、mutex_unlock(3C) を使用します。この mutex はロックされていなければなりません。呼び出しスレッドは、最後にこの mutex をロックしたスレッド、すなわち所有者でなければなりません。POSIX スレッドの場合については、「pthread_mutex_unlock の構文」を参照してください。
#include <thread.h> int mutex_unlock(mutex_t *mp);
mutex_unlock() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、mutex_unlock() は失敗し、対応する値を返します。
EFAULT
説明:mp が指すアドレスが正しくありません。
EPERM
説明:呼び出しスレッドは mutex を所有していません。
mp が指す mutex のロックを試行するには、mutex_trylock(3C) を使用します。この関数はブロックしない点を除いて、mutex_lock() と同じ働きをします。POSIX スレッドの場合については、「pthread_mutex_trylock の構文」を参照してください。
#include <thread.h> int mutex_trylock(mutex_t *mp);
mutex_trylock() は、正常終了時に 0 を返します。次のいずれかの条件が検出された場合、mutex_trylock() は失敗し、対応する値を返します。
EFAULT
説明:mp が指すアドレスが正しくありません。
EBUSY
説明:アクティブな mutex の再初期化を試行していることが検出されました。