2011-05-24 66 views
4

我有幾個線程同時執行並檢查自己的對象中的一個字段的值。該場是由發射線程設置是這樣的:易變易變和多核線程同步!

for (i = 0; i < ThreadCount; i++) 
{ 
    ThreadContext[i].MyField = 1; 
} 

在每個線程然後我檢查這個值的值:

if (MyField == 1) 
{ 
    ...//do something 
} 

然而,我注意到,一個4核CPU,一些(4)正在運行的線程需要幾個毫秒甚至更長的時間才能看到更改後的MyField。 MyField是單個字符字段。看起來正在發生的情況是,當內存總線被檢測到更改的第一個線程超時時,所有其他線程幾乎可能在第一個線程的整個運行期間停頓。 (假設有足夠的內存壓力)。只有當第一個線程簡化了內存(並且更多地使用寄存器)時,其他線程才能看到新的值。

我檢查了asm,並沒有在這裏的方式編譯器優化。調用直接進入內存。這怎麼解決?

謝謝! Jam

回答

1

我收到了來自Intel的反饋:是的,這就是它的工作原理(不容易修復)。

+0

你能確保你將這個答案標記爲接受嗎?謝謝。 – Kev 2011-05-25 16:28:27