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

Posted

技术标签:

【中文标题】如果使用同一个锁进入不同的临界区会发生啥【英文标题】:What happens if the same lock is used to enter different critical sections如果使用同一个锁进入不同的临界区会发生什么 【发布时间】:2021-10-25 00:33:08 【问题描述】:

我的代码中有 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,所以我在两个地方都使用了相同的锁。这样做可以吗?

【问题讨论】:

这似乎不是立即不合理的。虽然我建议用lock_guard 替换裸露的lock/unlock 调用。让编译器找出可以退出临界区的所有方法,而不是自己盯着它。 是的,你可以,但这是你想做的吗?如果两个临界区都操作相同的资源,则使用相同的锁是有意义的。如果他们操纵不同的资源,它仍然可能有意义,但我们需要更多信息来进行调用。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如果使用同一个锁进入不同的临界区会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

Synchronized锁的是什么?

uc/os进中断与进临界区有啥区别?

Linux同步技术之读写锁

乐观锁与悲观锁

Linux系统编程5_条件变量与互斥锁

Linux系统编程5_条件变量与互斥锁