看看這個代碼:多線程 - 我需要鎖定讀取數據嗎?
int data=5;
void Thread1()
{
if(data==5)
{
//nothing
}
}
void Thread2()
{
if(data==2)
{
//nothing
}
}
在這種情況下
,做我需要使用EnterCriticalSection的/ MutexLock之前如果(數據= =)?
看看這個代碼:多線程 - 我需要鎖定讀取數據嗎?
int data=5;
void Thread1()
{
if(data==5)
{
//nothing
}
}
void Thread2()
{
if(data==2)
{
//nothing
}
}
在這種情況下
,做我需要使用EnterCriticalSection的/ MutexLock之前如果(數據= =)?
如果您只是讀取數據,則不需要鎖。
如果您正在編寫數據AND您關心訂單數據的閱讀,那麼您需要使用CS來確保訂單是正確的。 (請注意,如果對象有一個更復雜的狀態,在原子操作中未更新,那麼您可能會更關心讀取/寫入的順序)。
如果不關心訂單,您仍然想要將變量更改爲volatile,否? – Inverse 2010-07-14 07:00:20
volatile的使用是依賴於多線程方面的編譯器體系結構。閱讀相應的文檔。 – 2010-07-14 14:23:55
如果什麼都不改變數據,那麼在大多數架構上,沒有。但如果沒有任何數據發生變化,代碼就沒有意義了。
這就是我的想法。 – GManNickG 2010-07-13 23:21:20
在產生任何額外的線程之前初始化一些全局變量是非常有用的,並且從這一點開始數據是共享讀取但不再被寫入。 – 2010-07-13 23:41:02
如果您的示例應該已經完成,然後否,您不必鎖定或管理任何關鍵部分,因爲您沒有修改任何內容。
但是你例子,因爲它是,它只是毫無意義的..
你不需要處理併發時有線程只是閱讀純數據(東西都放在可迭代的數據結構不同),但是這隻有當你有靜態數據不需要改變時纔有用。只要你添加一個作家,那麼你必須確保在沒有人正在閱讀的時候,如果沒有作者正在做它的工作,每個人都仍然能夠與其他讀者同時閱讀。
如果數據正在被另一個線程改變,那麼在讀取數據時需要一個內存欄以確保一致性。鎖是實現記憶圍欄的一種方式,但不一定是最佳方式。但是,除非您發現(通過測量!)鎖定會顯着減慢程序,否則可能不值得擔心替代方案。
就你而言,不,你不需要MutexLock。 – Siddiqui 2010-07-14 05:47:32