2013-10-13 47 views

回答

2

如果他們是只是閱讀,那麼你不需要鎖定。

2

如果他們只是在閱讀,那麼就不需要鎖定,但當情況並非如此,那麼我認爲互斥將確保閱讀線程不會佔用資源,而無需執行任何操作。

像這樣: -

Thread1() { 
Mutex_lock(); 
Process global_variable; 
Unlock_mutex(); 
} 

類似地,對於Thread2

在一個側面說明: -

互斥通常用於防止多線程訪問共享存儲器或其他資源同時。另外要記住,它不會鎖定任何東西

5

如果線程只讀取變量和沒有人正在寫入它(不是線程之一,而不是其他人),那麼你是完全沒有鎖。如果可能發生任何併發修改,那麼每個人(包括純粹的讀者)都必須以某種方式進行同步 - 通過互斥鎖,讀/寫鎖或其他方式進行同步。

3

一般來說,需要獨家訪問防止看到不一致的狀態。對於讀者線程,這意味着避免部分讀取

這是什麼意思?想象一下,你有一個存儲在兩個(原子)整數上的值,例如座標。

int i = 3; 
int j = 4; 

現在,我們要讀ij而他們進行修改,更準確地說,當一個Writer線程要以對角線方式移動從(3, 4)(4, 5)

Reader  Writer 
    |   | 
    |  i = 4 
    |   | 
i = 4  <pause> 
j = 4  | 
    |  j = 5 
    |   | 

這就是所謂的一個部分閱讀Reader線程已獲得信息,該對象是在(4, 4)即使它從來沒有。我就讓你想,如果這些座標被用來計算飛機的軌跡會發生什麼......

避免部分讀取但是是相當容易:突變應該看到原子。

  • 如果沒有突變(在這段時間的讀取),那麼你可以只讀取
  • 如果有突變,你需要一個互斥機制(如讀/寫互斥)

因此,要回答你的問題,如果只有訪問是讀取訪問,則不需要同步。但是如果你有時(甚至很少)修改讀取的信息,那麼你需要一些機制。

+0

與上述問題類似。例如,我有兩個線程。每個線程調用一個對象的方法來獲取它的屬性,例如A-> getName()。在這種情況下,互斥是必要的嗎? –

+0

@JohnSimpson:一個方法只不過是一個以'* this'作爲第一個參數的朋友函數的語法糖,所以問題只是關於*函數做了什麼?*如果方法只以只讀方式訪問對象方法,那麼它是沒問題的,所以如果方法是'const'或者函數通過const-pointer或const-reference接受對象,它應該沒問題(當心沒有考慮到多線程安全設計的mutable屬性) –