【问题标题】: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 调用。让编译器找出可以退出临界区的所有方法,而不是自己盯着它。
  • 是的,你可以,但这是你想做的吗?如果两个临界区都操作相同的资源,则使用相同的锁是有意义的。如果他们操纵不同的资源,它仍然可能有意义,但我们需要更多信息来进行调用。

标签: c++ multithreading operating-system locking


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2011-11-06
    • 2015-10-08
    相关资源
    最近更新 更多