2010-07-13 70 views
6

看看這個代碼:多線程 - 我需要鎖定讀取數據嗎?

int data=5; 

void Thread1() 
{ 
    if(data==5) 
    { 
     //nothing 
    } 
} 

void Thread2() 
{ 
    if(data==2) 
    { 
     //nothing 
    } 
} 
在這種情況下

,做我需要使用EnterCriticalSection的/ MutexLock之前如果(數據= =)?

+0

就你而言,不,你不需要MutexLock。 – Siddiqui 2010-07-14 05:47:32

回答

6

如果您只是讀取數據,則不需要鎖。

如果您正在編寫數據AND您關心訂單數據的閱讀,那麼您需要使用CS來確保訂單是正確的。 (請注意,如果對象有一個更復雜的狀態,在原子操作中未更新,那麼您可能會更關心讀取/寫入的順序)。

+0

如果不關心訂單,您仍然想要將變量更改爲volatile,否? – Inverse 2010-07-14 07:00:20

+0

volatile的使用是依賴於多線程方面的編譯器體系結構。閱讀相應的文檔。 – 2010-07-14 14:23:55

1

如果什麼都不改變數據,那麼在大多數架構上,沒有。但如果沒有任何數據發生變化,代碼就沒有意義了。

+0

這就是我的想法。 – GManNickG 2010-07-13 23:21:20

+6

在產生任何額外的線程之前初始化一些全局變量是非常有用的,並且從這一點開始數據是共享讀取但不再被寫入。 – 2010-07-13 23:41:02

0

如果您的示例應該已經完成​​,然後,您不必鎖定或管理任何關鍵部分,因爲您沒有修改任何內容。

但是你例子,因爲它是,它只是毫無意義的..

你不需要處理併發時有線程只是閱讀純數據(東西都放在可迭代的數據結構不同),但是這隻有當你有靜態數據不需要改變時纔有用。只要你添加一個作家,那麼你必須確保在沒有人正在閱讀的時候,如果沒有作者正在做它的工作,每個人都仍然能夠與其他讀者同時閱讀。

0

當你不修改共享內存時,你不需要鎖定,但是你的例子在你初始化data時很沒用,你檢查它的值,但是你永遠不要修改它......第二個線程是將完全無用。你是否在任何地方修改了data變量?

+0

它只是讓我的代碼更少,我有.ini文件,讀取並設置線程啓動前的數據, 我需要稍後從多個線程訪問該信息,而無需修改它:)不是無用的,應用程序是非常大:)) – Tenev 2010-07-13 23:48:25

+0

@tenev,我不是想說你在做什麼是無用的,但你提供給我們的例子意味着第二個線程根本不會做任何事情,因爲「數據」永遠是5 ... – Kiril 2010-07-14 04:29:54

1

如果數據正在被另一個線程改變,那麼在讀取數據時需要一個內存欄以確保一致性。鎖是實現記憶圍欄的一種方式,但不一定是最佳方式。但是,除非您發現(通過測量!)鎖定會顯着減慢程序,否則可能不值得擔心替代方案。