我有几个并发执行的线程并检查自己对象中的字段值。该字段由启动线程设置如下:
for (i = 0; i < ThreadCount; i++)
{
ThreadContext[i].MyField = 1;
}
在每个线程中,我检查该值的值:
if (MyField == 1)
{
...//do something
}
但是,我注意到在4核CPU上,一些(4)运行线程需要几毫秒甚至更长时间才能看到更改的MyField。 MyField是一个char字段。似乎正在发生的事情是当内存总线被检测到变化的第一个线程最大化时,所有其他线程几乎可以在第一个线程的整个持续时间内停止。 (假设有足够的记忆压力)。只有当第一个线程在内存上缓和(并且对寄存器执行更多操作)时,其他线程才会看到新值。
我检查了asm,这里没有编译器优化方式。呼叫直接进入内存。如何解决这个问题?
谢谢! 果酱
答案 0 :(得分:1)
我收到了英特尔的反馈意见:是的,这就是它的工作原理(不容易解决)。