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

时间:2016-08-11 09:44:07

标签: 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(a%2 == 0)  {
    // do something.
    }
}

期望的行为是我们希望两个线程尽可能地同步。

1 个答案:

答案 0 :(得分:1)

如果您要同步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();
}

每次在您想要使用特定资源之前锁定特定互斥锁,并在完成后解锁它,确保您对该资源上的操作进行同步。