POSIX反発ロック


作成と破棄
  • 静的初期化
  • pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • 動的初期化
  • int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
    struct pthread_mutexattr_t
    {
    	enum lock_type    //   pthread_mutexattr_settype   
    	{
    		PTHREAD_MUTEX_TIMED_NP [default]//        ,              ,           。
    		PTHREAD_MUTEX_ADAPTIVE_NP		//          ,           。
    		PTHREAD_MUTEX_RECURSIVE_NP		//                 。        。            。
    		PTHREAD_MUTEX_ERRORCHECK_NP		//           ,  EDEADLK,   PTHREAD_MUTEX_TIMED_NP    。
    	} type;
    } attr;		//  NULL       
  • 動的破棄
  • int pthread_mutex_destroy (pthread_mutex_t * mutex)
    Linuxでは、反発ロックはリソースを占有しないため、この関数はロック状態のみをチェックし、ロックであればEBUSYに戻ります.
    pthread_mutexattr_tのメンテナンス
    int pthread_mutexattr_init (pthread_mutexattr_t * attr);
    int pthread_mutexattr_destroy (pthread_mutexattr_t * attr);
    int pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int * pshared);
    int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared);
    int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
    int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int * kind);

    ロック操作
  • は、いずれのタイプのロックも、2つの異なるスレッドによって同時に得ることはできず、ロック解除を待たなければならない.
  • ロック解除者について:
  • 通常のロックおよび適応ロックタイプについて、ロック解除者は、プロセス内の任意のスレッド
  • であることができる.
  • ネストロックについては、ドキュメントおよび実装要件は、ロック者によってロック解除されなければならないが、実験結果は、このような制限はないことを示している.
  • エラーチェックロックは、ロック解除者によって有効である必要があります.そうしないと、EPERM-
  • に戻ります.
    int pthread_mutex_lock (pthread_mutex_t * mutex);
    int pthread_mutex_unlock (pthread_mutex_t * mutex);
    int pthread_mutex_trylock (pthread_mutex_t * mutex);//          EBUSY       

    その他
  • POSIXスレッドロック機構のLinux実装はいずれもキャンセルポイントではないため、遅延キャンセルタイプのスレッドはキャンセル信号を受信してロック待ちから離れることはない.
  • スレッドは、ロックが解除される前にキャンセルされ、ロックは常にロック状態を維持します.したがって、キーセグメント内にキャンセルポイントが存在するか、非同期キャンセルタイプが設定されている場合は、コールバック関数を終了するときにロックを解除する必要があります.
  • ロックメカニズムは、非同期信号が安全ではない.すなわち、信号処理中に反発ロックを使用すべきではない.そうしないと、デッドロックを引き起こしやすい.