如果使用同一个锁进入不同的临界区会发生什么

What happens if the same lock is used to enter different critical sections

我的代码中有 2 个关键部分。我可以使用同一个锁进入不同的临界区吗?我不明白这段代码会出什么问题。

void func1(int y, int z)
{
   writeLock.lock()
     x = y; // critical section 1
   writeLock.unlock()
   ...
   while(1)
   {
      writeLock.lock()
        myVar = z; // critical section 2

      writeLock.unlock()
      if (z == 100)
        break;
   }
}

我不想在循环内对 x = y 进行赋值,所以我在两个地方使用了相同的锁。这样做可以吗?

如果 xmyvar 完全不相交,那么你不应该对这两个关键部分使用相同的互斥锁,而是每个关键部分使用一个互斥锁。

这样做,如果一个线程在x临界区,那么没有其他线程可以进入同一个临界区,但是另一个线程可以进入myvar临界区(反之亦然) ).

在您的解决方案中,触摸 x 会阻止任何其他线程同时触摸 myvar,这似乎不合理。

« 可以吗? » 是的,它本身并没有 错误 ,但它不是最优的,因为它人为地序列化了可以同时执行的代码的不同部分。