Multithreading 在多核系统上同步多线程程序中的缓存
如何确保不同内核/处理器上的缓存随时同步。例如:Multithreading 在多核系统上同步多线程程序中的缓存,multithreading,caching,operating-system,synchronization,Multithreading,Caching,Operating System,Synchronization,如何确保不同内核/处理器上的缓存随时同步。例如: 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
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.
}
}
我们希望两个线程尽可能地同步 如果要同步
a++
和如果(a%2==0){/*执行某些操作*/}
您应该尝试以下操作:
std::mutex mtx;
// Thread 1:
while(1) {
mtx.lock();
a++;
mtx.unlock();
}
// Thread 2:
while(1){
mtx.lock();
if(a%2 == 0) {
mtx.unlock();
// do something.
}
mtx.unlock();
}
每次在使用特定资源之前锁定特定的互斥锁,并在使用完毕后解锁,请确保该资源上的操作是同步的。您有一个常见的误解,即内存可见性问题与内存缓存有关。事实并非如此。现代处理器确保其缓存在硬件上同步(将“MESI协议”输入到您最喜欢的搜索引擎中)。为了正确地重新表述您的问题,您想知道的是如何确保一个线程执行的值更改对其他线程可见。例如,在您的代码中,主要问题可能是编译器优化将导致
a++
根本不是内存操作。这肯定是一个解决方案,但我想知道除了传统的锁/信号量解决方案之外,是否还有其他方法可以解决此问题?因为毕竟需要锁并不是那么难的问题。如果两个线程都在写入变量,我们肯定需要锁。但是一个线程只是在执行一个原子读取操作,因此我觉得锁是可以避免的。