2016-09-19 8 views
0

mutexとpthreadsに関する質問があります。pthread mutexで共有リソースを処理する方法

共有フラグがある場合は、そのフラグを呼び出します(F1)。そして、複数のスレッドがあります。 しかし、1つのスレッド(T1)だけがフラグを立てたり/止めたりすることができ、他のすべてのスレッド(T2..Tn)はステータスの読み取りまたはプルだけを行います。

フラグF1を新しい値に設定するときに、T1がmutex_lock/mutex_unlockを使用すれば十分ですか? 他のスレッドもmutex_lock/mutex_unlockを使用すべきですか?F1からのステータスだけを読み込むつもりですか?

Exemple1: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      if(F1) { 
       /* Do something */ 
      } 
     } 
    } 



Exemple2: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      if(F1) { 
       /* Do something */ 
      } 
      pthread_mutex_unlock(&lock); 
     } 
    } 

答えて

1

シングルライターとマルチリーダーのイディオムを使用できます。

読書:

pthread_rwlock_rdlock(&rwlock); 

執筆:

pthread_rwlock_wdlock(&rwlock); 

ご利用の場合は、あなたが投稿の例のように単純である場合は、アトミックのフラグを含むロックフリー版を考えるかもしれません。

1

pthreadsモデルでは、読者doも同期操作を実行する必要があります。これは、あなたが説明したように、リーダーとライターの両方でpthread_mutex_lock()/pthread_mutex_unlock()のペア、あるいはリーダーライターロックのmetalfox's suggestionのいずれかです。

関連する問題