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++
根本不是内存操作。这肯定是一个解决方案,但我想知道除了传统的锁/信号量解决方案之外,是否还有其他方法可以解决此问题?因为毕竟需要锁并不是那么难的问题。如果两个线程都在写入变量,我们肯定需要锁。但是一个线程只是在执行一个原子读取操作,因此我觉得锁是可以避免的。