为什么说锁违反了抽象和可组合性原则?
Why are locks said to violate the principles of abstraction and composability?
我在 Google 甚至 Whosebug 上都找不到任何明确的答案来回答这个问题。
据我了解
- 使用锁的线程可以破坏抽象
- 锁不可组合
但是锁如何以及为什么会破坏抽象和可组合性?
我不是专家,我在网上也找不到任何东西。我可能和你在大学做同样的主题,这是我想出的(根据个人经验)。
锁对抽象原则造成的问题是,锁的状态及其资源可能无法由当前执行的指令集的状态确定。例如,在 C++ 中,您可以有一个 Baker class,它需要对某些 Oven 对象进行互斥访问。面包师需要经常使用烤箱(open/close/put 里面的东西)并且需要独占访问烤箱才能这样做,但是这不能真正抽象,因为他究竟何时需要这种互斥访问可能对他的功能很重要.
我们可能需要向我们的系统添加独立于面包师的功能,但需要对面包师正在使用的同一烤箱进行互斥访问。在实现这些更改时,由于锁如何同时依赖于多个线程的状态,我们不能保证先前抽象的 Baker class 的行为在我们的程序运行时会保持不变。 (例如:如果烤箱正在被另一个线程使用,面包师可能会决定等待 30 分钟,然后再检查烤箱是否再次空闲,这可能是不受欢迎的低效行为)。
由于同样的问题,锁也违反了可组合性原则,因为如果程序的不同组件都依赖于彼此在多线程应用程序中潜在的未定义行为,则无法无缝组合。
希望对您有所帮助 - 让我知道您的想法,以便我们一起取得成功。
通俗地说,可组合性是指采用两个或多个功能程序并从中创建一个更大的程序。组合应该基于已发布的接口并且不知道内部细节。
参考https://en.wikipedia.org/wiki/Lock_(computer_science)#cite_note-5。在这个例子中,在不知道锁定协议(账户实现细节class)
的情况下,无法正确编写转账方法
我在 Google 甚至 Whosebug 上都找不到任何明确的答案来回答这个问题。
据我了解
- 使用锁的线程可以破坏抽象
- 锁不可组合
但是锁如何以及为什么会破坏抽象和可组合性?
我不是专家,我在网上也找不到任何东西。我可能和你在大学做同样的主题,这是我想出的(根据个人经验)。
锁对抽象原则造成的问题是,锁的状态及其资源可能无法由当前执行的指令集的状态确定。例如,在 C++ 中,您可以有一个 Baker class,它需要对某些 Oven 对象进行互斥访问。面包师需要经常使用烤箱(open/close/put 里面的东西)并且需要独占访问烤箱才能这样做,但是这不能真正抽象,因为他究竟何时需要这种互斥访问可能对他的功能很重要.
我们可能需要向我们的系统添加独立于面包师的功能,但需要对面包师正在使用的同一烤箱进行互斥访问。在实现这些更改时,由于锁如何同时依赖于多个线程的状态,我们不能保证先前抽象的 Baker class 的行为在我们的程序运行时会保持不变。 (例如:如果烤箱正在被另一个线程使用,面包师可能会决定等待 30 分钟,然后再检查烤箱是否再次空闲,这可能是不受欢迎的低效行为)。
由于同样的问题,锁也违反了可组合性原则,因为如果程序的不同组件都依赖于彼此在多线程应用程序中潜在的未定义行为,则无法无缝组合。
希望对您有所帮助 - 让我知道您的想法,以便我们一起取得成功。
通俗地说,可组合性是指采用两个或多个功能程序并从中创建一个更大的程序。组合应该基于已发布的接口并且不知道内部细节。
参考https://en.wikipedia.org/wiki/Lock_(computer_science)#cite_note-5。在这个例子中,在不知道锁定协议(账户实现细节class)
的情况下,无法正确编写转账方法