如果使用 Atomic,是否存在锁争用

If Atomic is used, is there a lock contention

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

假设:我们要使用ARM指令执行两种命令

我们有10家店,每家都卖产品,有一个中心老板拿着一本分类账,记录销售的产品总数。

如果我们使用独占,我的图片是: 10家店说我要更新总和,BOSS把账本给其中一家,他把售出的产品加到总和上。 然后老板把账本交给下一家店。他们轮流轮流,这样总和就不会搞砸了。

如果我们使用原子,我的图像是: 10家店只写信给BOSS,说卖了多少,BOSS自己一个一个算。没有授予任何商店等的许可。 总和只是为 10 个商店做 AtomicAdd。 那么在这种情况下,要争夺的锁是什么?

atomic 没有处理您正在查看的概念。假设其中一家商店的产品数量非常多,销量也很高。这家商店位于 哥谭市,有很多顾客和员工。大区老大喊着'STOP'把账本加起来。不幸的是,更新 Gotham City 壁架的员工将 999,999 更改为 1,000,000,数字显示为 1,000,999。

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

现在,假设有地区老板和国家老板。国家老板尝试两种方法来计算所有销售额。她对所有区域老板进行汇总,并对所有门店进行全面清点。这些数字不会相等,除非她大喊 'STOP' 以确保没有销售,并且每个区域经理都可以进行区域计数。她可以在基本过程停止的同时进行全国总计数。不幸的是,由于这花费的时间和造成的销售损失,公司破产了。


业务改革,他们决定一次只统计一个地区。地区老板或国家老板都可以为该地区大喊'STOP'。当两个老板同时大喊 'STOP' 时,就会发生锁争用。另外,销售如何重启?一个老板要喊'GO'。如果两个老板同时清点销量,第一个结束的老板一喊'GO'店铺就会开始转售。这会导致库存盘点不准确(以及一次只盘点一个本地区域),并且企业会破产,因为他们没有产品可卖,客户会感到沮丧并转向其他地方。


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


第二种情况存在锁争用问题。锁正在呼唤 'STOP' 和 'GO',当多个 actors/processes 想要同时使用该锁时,您会发生争用。所有案例都是 atomic 的问题。这是更新信息的能力,以便在其他读取(或读取更新)值时保持一致。在最后一种情况下,机器为业务提供了一个 'lock-free' 原语,因此他们可以自动更新计数而无需锁定。

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