首页 > 解决方案 > 如果使用 Atomic,是否存在锁争用

问题描述

这不是特定于任何语言的。只是想更好地了解“锁定争用”术语。

比方说:我们要使用 ARM 指令执行两种命令

我们有 10 家店,每家卖产品,有一个中央老板拿着一个账簿,记录着销售的总产品。

如果我们使用独占,我的形象是:10 家店铺说我要更新总和,BOSS 给其中一家店铺的账本,他将销售的产品添加到总和中。然后老板把账本交给下一家商店。他们都轮流,所以总和不会搞砸。

如果我们用atomic的话,我的形象是:10家店只给BOSS写信说他们卖了多少产品,BOSS会自己一个一个算。没有授予任何商店等权限。总和只是为 10 家商店做 AtomicAdd。那么在这种情况下,要抗衡的锁是什么呢?

标签: atomiclock-freemutual-exclusion

解决方案


atomic不是处理您正在查看的概念。可以说其中一家商店的产品数量非常多,而且数量很多。这家商店在 哥谭市,有很多顾客和员工。区域老板大喊“停止”以添加分类帐。不幸的是,更新Gotham City窗台的员工将 999,999 更改为 1,000,000,数字读取为 1,000,999。

如果区域老板不能喊“停止”,那么其他商店的员工可以在计算库存时更改计数。如果商店交换库存,这可能会导致不准确。此外,您永远不会知道某个时间的实际销售额,因为在要访问的第一个商店和最后一个商店计数之间,您在所有商店都有销售,这将改变总和的准确性。

现在,假设有区域老板和国家老板。全国老板尝试了两种方法来计算所有的销售额。她将所有区域老板的点数相加,并对所有商店进行全盘点。除非她大喊“停止”以确保没有销售,并且每个区域经理都可以进行区域计数,否则这些数字将不相等。她可以在基本过程停止的同时进行全国总计数。不幸的是,由于这需要时间和它造成的销售损失,企业破产了。


业务改革,他们决定一次只计算一个地区。区域老板或国家老板可能会为该地区大喊“停止”。当两个老板同时大喊“停止”时,就会发生锁定争用。另外,销售如何重启?老板必须大喊“GO”。如果两个老板同时进行销售计数,那么只要第一个老板完成大喊“GO”,商店就会开始倒卖。这会导致库存计数不准确(以及一次只计算一个本地区域),并且企业破产,因为他们没有产品可销售,客户感到沮丧并转向其他地方。


公司进行了改革,他们决定每次进行销售时,销售人员都会更新区域计数和国家计数。由于全国经理之前看到了一些问题,她考虑了很长时间销售人员将如何更新这些计数。他们购买了一台机器,每次按下按钮时计数都会增加一个。正如她所知,如果员工必须查看计数,则地区和国家编号可能会在他们计算新数字时发生变化。


第二种情况有锁争用问题。锁在喊“停止”和“开始”,当多个参与者/进程想要同时使用该锁时,您会发生争用。所有情况都是atomic. 这是更新信息的能力,以便在其他读取(或读取更新)该值时保持一致。在最后一种情况下,机器为业务提供了一个“无锁”原语,因此他们可以在不需要锁的情况下自动更新计数。

当您进行涉及多个原子值或读取和写入混合的计算时,需要使用锁。如果该值一开始就不是原子的,那么即使锁也不起作用。


推荐阅读