【问题标题】:Locking/unlocking a synchronisation primitive in different functions from code design point of view从代码设计的角度来看,在不同功能中锁定/解锁同步原语
【发布时间】:2015-07-21 09:03:50
【问题描述】:

假设互斥锁或自旋锁在一个函数中被锁定而在另一个函数中被解锁(在同一个线程中)。在哪些情况下被认为是合适的,在哪些情况下是不合适的?我对这个问题的设计/模式/架构感兴趣。

我几乎可以肯定,这种方法通常是不可取的,因为这样我们可以跨过在不相关的代码块中释放锁的责任,尽管我没有足够的经验来自己回答这个问题。

PS:我查看了以下链接,但对我没有帮助: Linux Kernel - Can I lock and unlock Spinlock in different functions?

【问题讨论】:

    标签: multithreading


    【解决方案1】:

    锁定和解锁操作之间的距离越远,对代码的推理就越困难。将它们放在单独的函数中比在同一个函数中大大分离要困难得多(假设这些函数不仅仅是锁定/解锁的包装器,而且还有其他行为)。

    如果可以使用自动配对锁定和解锁的方法(例如使用 Java 的 lock 关键字或 C++ 的 std::lock_guard),请优先使用它。这些构造有助于确保在异常情况下以及通过代码的“快乐路径”中的正确行为。

    如果您确实需要在函数返回之外持有锁,确保在函数的注释中明确指出(如果是 C 或 C++,则在声明和实现文件中)并说明哪个函数应该调用来释放锁。

    通常,这种对锁的扩展持有可以更好地表示为状态变量(它本身必须以原子方式访问)而不是锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多