Linuxスレッド-反発ロックpthread_mutex_t


スレッドの実際の実行中には、同期を維持するために複数のスレッドが必要になることがよくあります.この場合、反発ロックでタスクを完了することができます.反発ロックの使用中、主にpthread_があります.mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlockといういくつかの関数は、ロックの初期化、ロックの破棄、ロックの解除、ロックの解放を完了します.
一、ロックの作成
ロックは動的または静的に作成でき、マクロPTHREAD_を使用できます.MUTEX_INITIALIZERによる静的初期化ロックは,この方式で比較的容易に理解できるが,反発ロックはpthread_mutex_tの構造体であり、このマクロは構造定数であり、以下のように静的初期化ロックを完了することができる.
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
またロックはpthread_を使用できますmutex_Init関数の動的作成、関数のプロトタイプは以下の通りです.
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)
二、ロックの属性
反発ロックプロパティはpthread_mutexattr_init(pthread_mutexattr_t *mattr);をクリックして初期化し、他のプロパティ設定方法を呼び出してプロパティを設定できます.
反発ロックの範囲:プロセスが他のプロセスと同期するか、同じプロセス内の異なるスレッドと同期するかを指定できます.PTHREAD_に設定できますPROCESS_SHAREとPTHREAD_PROCESS_PRIVATE.デフォルトは後者で、プロセス内でロックが使用されていることを示します.int pthread_を使用できますmutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)
pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)
ロックの設定と取得に使用される範囲.
反発ロックのタイプ:次の値取り領域があります.
  PTHREAD_MUTEX_TIMED_NP、これはデフォルト値、すなわち通常ロックです.1つのスレッドがロックされると、残りのロックを要求するスレッドは待機キューを形成し、ロックが解除された後に優先度にロックを取得します.このロックポリシーは、リソース割り当ての公平性を保証します.  PTHREAD_MUTEX_RECURSIVE_NP,ネストロック,同じスレッドが同じロックに対して複数回成功し,複数回unlockによってロックを解除することを可能にする.異なるスレッドリクエストの場合、ロックスレッドのロック解除時に再競合します.  PTHREAD_MUTEX_ERRORCHECK_NP、エラーチェックロック、同じスレッドが同じロックを要求した場合はEDEADLK、そうでなければPTHREAD_MUTEX_TIMED_NPタイプの動作は同じです.これにより、複数回のロックが許可されていない場合、最も簡単なデッドロックが発生しないことが保証される.  PTHREAD_MUTEX_ADAPTIVE_NPは,ロックに適応し,動作が最も簡単なロックタイプで,ロック解除後の再競合のみを待つ.
pthread_を使用できますmutexattr_settype(pthread_mutexattr_t *attr , int type) pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
ロックのタイプを取得または設定します.
三、ロックの解放
pthread_を呼び出すmutex_destoryの後、ロックが占有するリソースは解放されますが、ロックが現在ロックされていない状態であることが前提です.
四、ロック操作
ロックに対する操作は主にpthread_をロックすることを含む.mutex_ロック()、ロック解除pthread_mutex_unlock()とテストロックpthread_mutex_trylock()3つ.
  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_ロック()と同様に、ロックが占有されたときにEBUSYに戻るのではなく、保留中であることが異なります.
五、鍵の使用
#include <pthread.h>
#include <stdio.h>

pthread_mutex_t mutex ;
void *print_msg(void *arg){
        int i=0;
        pthread_mutex_lock(&mutex);
        for(i=0;i<15;i++){
                printf("output : %d
",i); usleep(100); } pthread_mutex_unlock(&mutex); } int main(int argc,char** argv){ pthread_t id1; pthread_t id2; pthread_mutex_init(&mutex,NULL); pthread_create(&id1,NULL,print_msg,NULL); pthread_create(&id2,NULL,print_msg,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_mutex_destroy(&mutex); return 1; }

1つのスレッド1つのスレッドが実行されます.