2016-09-19 76 views
0

我有一個關於互斥鎖和pthread的問題。如何使用pthread互斥處理共享資源

如果有共享標誌,我們稱之爲(F1)。並且有多個線程。 但是隻有一個線程(T1)可以提升/停止標誌,而所有其他線程(T2..Tn)只能讀取或拉取狀態。

如果T1使用mutex_lock/mutex_unlock標誌F1將被設置爲新值時,這足夠了嗎? 所有其他線程是否也應該使用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

您可以使用single-writer-multiple-readers成語。

閱讀:

pthread_rwlock_rdlock(&rwlock); 

寫作:

pthread_rwlock_wdlock(&rwlock); 

如果你的使用情況是因爲您發佈的例子一樣簡單,你可能會考慮涉及原子標誌一個無鎖版。

1

在pthreads模型下,讀取器也需要執行同步操作。如上所述,這可以是讀寫器中的pthread_mutex_lock()/pthread_mutex_unlock()對,也可以是讀寫器鎖的metalfox's suggestion