multicore – Volatile vars和多核线程同步!
发布时间:2020-12-15 02:25:54 所属栏目:Java 来源:网络整理
导读:我有几个并发执行的线程,并检查自己对象中的字段值.该字段由启动线程设置如下: for (i = 0; i ThreadCount; i++){ ThreadContext[i].MyField = 1;} 在每个线程中,然后我检查此值的值: if (MyField == 1){ ...//do something} 但是,我注意到在4核CPU上,一些
我有几个并发执行的线程,并检查自己对象中的字段值.该字段由启动线程设置如下:
for (i = 0; i < ThreadCount; i++) { ThreadContext[i].MyField = 1; } 在每个线程中,然后我检查此值的值: if (MyField == 1) { ...//do something } 但是,我注意到在4核CPU上,一些(4)运行线程需要几毫秒甚至更长时间才能看到更改后的MyField. MyField是一个char字段.似乎正在发生的事情是当内存总线被检测到变化的第一个线程最大化时,所有其他线程几乎可以在第一个线程的整个持续时间内停止. (假设有足够的记忆压力).只有当第一个线程在内存上缓和(并且对寄存器执行更多操作)时,其他线程才会看到新值. 我检查了asm,这里没有编译器优化方式.呼叫直接进入内存.怎么解决这个问题? 谢谢! 解决方法
我得到了英特尔的反馈意见:是的,这就是它的工作原理(不容易解决).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |