为什么据说锁违反了抽象和合成性的原则?

问题描述 投票:0回答:2
我未能在Google上找到任何明确的答案,甚至无法堆栈弗洛(Stackoverflow)回答此问题。

从我的理解

使用使用锁的线程可以打破抽象

locks不可综合
  • 但如何以及为什么锁定抽象和合成性?

我不是专家,我也找不到任何在线上的东西。我可能与您在Uni的主题相同,这是我想到的(根据个人经验)。

问题锁定了抽象原则,即锁状态及其资源可能无法通过当前执行指令集的状态确定。例如,在C ++中,您可以拥有一个面包师类,这需要对某些烤箱对象的共同访问。面包师需要经常使用烤箱(开放/关闭/将物品放在里面),并且需要独家访问烤箱才能这样做,但是这不能真正抽象出来,因为当他确切需要这种相互排斥的访问可能对他的功能可能很重要时, .
abstraction locks system-design
2个回答
2
投票
我们可能需要在与面包师分开的系统中添加功能,但需要相互排他性地访问面包师正在使用的同一烤箱。在实施这些更改时,由于锁如何依赖于多个线程的状态,我们不能确保在我们程序的运行时在先前提取的贝克类的行为将保持不变。 (例如:如果另一个线程使用烤箱,面包师可能会决定等待30分钟,然后检查是否再次自由,这可能是不需要的,效率低下的行为)。 在同一问题上,锁还违反了合成性原理,因为如果程序的不同组件在多线程应用程序中彼此的潜在不确定的行为,则无法无缝组成。

希望有帮助的 - 让我知道您的想法,以便我们可以一起解决这个问题。

complysy,合成性意味着要采用两个或多个功能程序,并从中制定更大的程序。构图应基于已发布的接口,而不了解内部细节。

提交给

Https://en.wikipedia.org/wiki/lock_(computer_science)#cite_note-5

。在此示例中,如果不知道锁定协议(帐户类的实现详细信息),则无法正确编写转移方法。

非补充性的例子(取自软件交易记忆材料):

0
投票
现在考虑一个线程需要将元素从A删除并将其插入B中的情况,但是其他线程不得观察到该元素都不在(或两者)中的中间状态。 如果不添加A和B的组合,这是不可能的。所有线程(包括仅处理A或仅B)的线程,现在必须担心此组合锁定。 抽象和合成性破坏了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.