【发布时间】:2016-12-17 23:31:19
【问题描述】:
如何确保不同内核/处理器上的缓存在任何时候都相互同步。例如:
Thread 1:
while(1) {
a++;
}
Thread 2:
While(1) {
if(a%2 == 0) {
// do something
}
}
在线程 2 中,当尝试访问 a 时,a 不会反映最新值。这种使用锁的实现会是一个正确的解决方案吗? :
Thread 1:
while(1) {
a++;
}
Thread 2:
while(1){
lock();
unlock();
if(a%2 == 0) {
// do something.
}
}
期望的行为是我们希望两个线程尽可能同步。
【问题讨论】:
-
您有一个常见的误解,即内存可见性问题与内存缓存有关。这不是真的。现代处理器确保它们的缓存在硬件中同步(将“MESI 协议”打入您最喜欢的搜索引擎)。为了正确地改写您的问题,您想知道的是如何确保一个线程执行的值更改对其他线程可预见地可见。例如,在您的代码中,主要问题可能是编译器优化将导致
a++根本不是内存操作。
标签: multithreading caching operating-system synchronization