多核系统中多线程程序的缓存同步



如何确保不同内核/处理器上的缓存在任何时刻都是同步的。例如:

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++;if(a % 2 == 0) { /* do something */ },你应该试试这个:

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();
}

每次在你想要使用一个特定的资源之前锁定一个特定的互斥锁,并在你完成时解锁它,确保你对该资源的操作是同步的。

最新更新