如果我有以下的僞代碼:在產生訪問它的子線程之前,是否應該訪問由父線程鎖定的共享資源?
sharedVariable = somevalue;
CreateThread(threadWhichUsesSharedVariable);
是理論上可能的多核CPU在threadWhichUsesSharedVariable()父線程寫入之前讀取sharedVariable的值執行代碼?有關連的競爭條件的可能性極小充分的理論迴避,應該代碼看起來像這個:
sharedVariableMutex.lock();
sharedVariable = somevalue;
sharedVariableMutex.unlock();
CreateThread(threadWhichUsesSharedVariable);
基本上我想知道的產卵線程在那個時候顯式線性化CPU,並且保證這樣做。
我知道線程創建的開銷可能需要足夠的時間,這在實踐中永遠不會起作用,但我的完美主義者害怕理論上的競爭條件。在極端情況下,某些線程或內核可能會嚴重滯後,其他線程可能會快速高效地運行,但我可以想象,除非出現鎖定,否則執行順序(或內存訪問)可能會反向。
我的問題涉及到像C++這樣的語言,其中您接近機器級別,並使用簡單的InterlockedExchange循環實現「鎖定」。 我擔心聲明變量「volatile」不足以確保同步。 「原子」和「同步」之間沒有區別嗎?原子操作不能被分割 - 如果一個變量被聲明爲volatile,編譯器不會重新對它進行排序 - 但是CPU不能重新排序它們?特別是當被不同內核訪問時? – Deadcode 2010-02-11 08:38:09
附加說明:在我的示例中,「sharedVariable = somevalue」用於將數據傳遞給threadWhichUsesSharedVariable。 threadWhichUsesSharedVariable在由父線程分配後才訪問「sharedVariable」,這一點非常重要。 – Deadcode 2010-02-11 08:50:00
如果重新排序對程序不可見 ,CPU只能重新排序訪問,所以CPU重新排序不應該成爲問題。設計多核系統的複雜性大部分在於確保程序從不會看到與單核系統有所不同的行爲。 – 2010-02-11 16:55:35