Linux pthread_mutex_Init()関数の使用概要


Linuxスレッド同期は、通常はロックを使用して完了します.posixの下で抽象的なロックタイプの構造:ptread_mutex_t.この構造に対する操作により,リソースがアクセスできるか否かを判断する.名前の通り、ロックをかけると、他の人は開けられず、ロックが閉じていない場合にのみリソースにアクセスできます.
オブジェクト反発ロックの概念は、共有データ操作の完全性を保証します.各オブジェクトは、任意の時点で1つのスレッドしかオブジェクトにアクセスできないことを保証する「反発ロック」と呼ばれるタグに対応します.
反発ロック(反発)を使用すると、スレッドを順番に実行できます.通常、反発ロックは、1回に1つのスレッドのみがコードを実行する臨界セグメントを確保することによって、複数のスレッドを同期する.反発ロックは、単一スレッドコードを保護することもできます.
デフォルトの反発ロック属性を変更するには、属性オブジェクトを宣言および初期化します.通常、反発ロックプロパティは、アプリケーションの最初の場所に設定され、迅速に検索および簡単に変更できます.       
1.関数プロトタイプ:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);

 
 
 
         pthread_mutex_Init()関数はダイナミックに反発ロックを作成し、パラメータattrは新しい反発ロックのプロパティを指定します.パラメータattrがNULLの場合、デフォルトの反発ロックプロパティが使用され、デフォルトのプロパティは高速反発ロックです.反発ロックのプロパティは、ロックを作成するときに指定され、LinuxThreads実装ではロックタイプのプロパティが1つしかなく、ロックされた反発ロックにロックをかけようとするときに異なるロックタイプが表現されます.
   pthread_mutexattr_Init()関数が正常に完了するとゼロが返され、他の戻り値はエラーを示します.関数が正常に実行されると、反発ロックはロック状態に初期化されます.
2.反発ロック属性
反発ロックのプロパティは、ロックを作成するときに指定され、LinuxThreads実装ではロックタイプのプロパティが1つしかなく、ロックされた反発ロックにロックをかけようとするときに異なるロックタイプが表現されます.現在(glibc 2.2.3、linuxthreads 0.9)には、次の4つの値があります.
  * PTHREAD_MUTEX_TIMED_NP、これはデフォルト値、すなわち通常ロックです.1つのスレッドがロックされると、残りのロックを要求するスレッドは待機キューを形成し、ロックが解除された後に優先度にロックを取得します.このロックポリシーは、リソース割り当ての公平性を保証します.
  * PTHREAD_MUTEX_RECURSIVE_NP,ネストロック,同じスレッドが同じロックに対して複数回成功し,複数回unlockによってロックを解除することを可能にする.異なるスレッドリクエストの場合、ロックスレッドのロック解除時に再競合します.
  * PTHREAD_MUTEX_ERRORCHECK_NP、エラーチェックロック、同じスレッドが同じロックを要求した場合はEDEADLK、そうでなければPTHREAD_MUTEX_TIMED_NPタイプの動作は同じです.これにより、複数回のロックが許可されていない場合、最も簡単なデッドロックが発生しないことが保証される.
  * PTHREAD_MUTEX_ADAPTIVE_NPは,ロックに適応し,動作が最も簡単なロックタイプで,ロック解除後の再競合のみを待つ.
3.その他のロック操作
ロック操作には主にpthread_のロックが含まれます.mutex_ロック()、ロック解除pthread_mutex_unlock()とテストロックpthread_mutex_trylock()の3つは,いずれのタイプのロックでも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)
pthread_mutex_trylock()の意味とpthread_mutex_lock()と同様に、ロックが占有されたときにEBUSYに戻るのではなく、保留中である.
4.デッドロック:
デッドロックは、主に複数の依存ロックが存在する場合に発生する、あるスレッドが別のスレッドとは逆の順序で反発量をロックしようとする場合に発生する.デッドロックを回避するには,反発量を用いて特に注意すべきものである.
全体的に言えば、いくつかの不文の基本原則があります.
  • 共有リソースに対して操作する前に、必ずロックを取得してください.
  • 操作が完了したら、必ずロックを解除してください.
  • は、できるだけ短時間でロックを占有する.
  • マルチロックがある場合、取得順序がABCリンクであれば、解放順序もABCであるべきである.
  • スレッドエラーが返された場合、取得したロックを解放する必要があります.

  •