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

mutex のロック

mutex が指す mutex をロックするには、pthread_mutex_lock(3C) を使用します。

pthread_mutex_lock の構文

int  pthread_mutex_lock(pthread_mutex_t *mutex); 
#include <pthread.h>

pthread_mutex_t mutex;
int ret;

ret = pthread_ mutex_lock(&mp); /* acquire the mutex */

mutex は、pthread_mutex_lock() から制御が戻るとロックされます。呼び出しスレッドが所有者になります。mutex が別のスレッドによってすでにロックされている (所有されている) 場合は、呼び出しスレッドは mutex が使用可能になるまでブロックされます。

mutex 型が PTHREAD_MUTEX_NORMAL の場合、デッドロックの検出は行われません。mutex をもう一度ロックしようとするとデッドロックが発生します。スレッドが、スレッドによってロックされていない mutex やロック解除された mutex をロック解除しようとした場合、引き起こされる動作は未定義です。

mutex 型が PTHREAD_MUTEX_ERRORCHECK の場合、エラーチェックが行われます。スレッドが、すでにロックした mutex をもう一度ロックしようとすると、エラーが返されます。スレッドが、スレッドによってロックされていない mutex やロック解除された mutex をロック解除しようとすると、エラーが返されます。

mutex 型が PTHREAD_MUTEX_RECURSIVE の場合、mutex はロックカウントの概念を持ちます。スレッドが初めて正常に mutex を獲得すると、ロックカウントは 1 に設定されます。この mutex をスレッドがさらにロックするたびに、ロックカウントが 1 ずつ増えます。スレッドが mutex をロック解除するたびに、ロックカウントが 1 ずつ減ります。ロックカウントが 0 になると、別のスレッドがこの mutex を獲得できるようになります。スレッドが、スレッドによってロックされていない mutex やロック解除された mutex をロック解除しようとすると、エラーが返されます。

mutex 型 PTHREAD_MUTEX_DEFAULTPTHREAD_MUTEX_NORMAL と同じです。

pthread_mutex_lock の戻り値

pthread_mutex_lock() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、この関数は失敗し、対応する値を返します。


EAGAIN

説明:

mutex の再帰的なロックが最大数を超えるため、mutex を獲得できません。


EDEADLK

説明:

現在のスレッドがすでにその mutex を獲得しています。

mutex が PTHREAD_MUTEX_ROBUST_NP の堅牢度属性で初期化された場合、pthread_mutex_lock() は次のいずれかの値を返す可能性があります。


EOWNERDEAD

説明:

この mutex の前の所有者が mutex を保持している間に終了しました。現在この mutex は、呼び出し元によって所有されています。呼び出し元は、mutex によって保護された状態を整合させるよう試行する必要があります。

呼び出し元が状態を整合させることができた場合、その mutex に対して pthread_mutex_consistent_np() を呼び出して、mutex をロック解除します。これ以降の pthread_mutex_lock() の呼び出しは正常に動作します。

呼び出し元が状態を整合させることができない場合は、その mutex に対して pthread_mutex_init() を呼び出さないでください。代わりに mutex をロック解除します。これ以降の pthread_mutex_lock() のすべての呼び出しは mutex の獲得に失敗し、エラーコード ENOTRECOVERABLE を返します。

EOWNERDEAD を持つロックを獲得した所有者が mutex を保持している間に終了すると、次の所有者が EOWNERDEAD を持つロックを獲得します。


ENOTRECOVERABLE

説明:

獲得しようとしている mutex は、この mutex の前の所有者によって回復不能のままにされた状態を保護していました。mutex は獲得されませんでした。この回復可能な状態は、次のような場合に発生します。

  • 以前、このロックが EOWNERDEAD によって取得された

  • 所有者が状態をクリーンアップできなかった

  • 所有者が mutex の状態を整合させないで mutex をロック解除した


ENOMEM

説明:

同時に保持される mutex の上限数を超えています。