我有几个线程同时执行并检查它们自己对象中字段的值。该字段由启动线程设置,如下所示:
for (i = 0; i < ThreadCount; i++)
{
ThreadContext[i].MyField = 1;
}
然后在每个线程中检查这个值的值:
if (MyField == 1)
{
...//do something
}
但是,我注意到在 4 核 CPU 上,一些 (4) 个正在运行的线程需要几毫秒甚至更长的时间才能看到更改后的 MyField。MyField 是一个单字符字段。似乎正在发生的事情是,当内存总线被检测到更改的第一个线程最大化时,所有其他线程可能几乎在第一个运行的整个持续时间内都停止。(假设有足够的内存压力)。只有当第一个线程减少内存(并且对寄存器做更多的事情)时,其他线程也可以看到新值。
我检查了asm,这里没有编译器优化。调用直接进入内存。如何解决这个问题?
谢谢!果酱