atomic - 如果使用 Atomic,是否存在锁争用
问题描述
这不是特定于任何语言的。只是想更好地了解“锁定争用”术语。
比方说:我们要使用 ARM 指令执行两种命令
我们有 10 家店,每家卖产品,有一个中央老板拿着一个账簿,记录着销售的总产品。
如果我们使用独占,我的形象是:10 家店铺说我要更新总和,BOSS 给其中一家店铺的账本,他将销售的产品添加到总和中。然后老板把账本交给下一家商店。他们都轮流,所以总和不会搞砸。
如果我们用atomic的话,我的形象是:10家店只给BOSS写信说他们卖了多少产品,BOSS会自己一个一个算。没有授予任何商店等权限。总和只是为 10 家商店做 AtomicAdd。那么在这种情况下,要抗衡的锁是什么呢?
解决方案
atomic
不是处理您正在查看的概念。可以说其中一家商店的产品数量非常多,而且数量很多。这家商店在 哥谭市,有很多顾客和员工。区域老板大喊“停止”以添加分类帐。不幸的是,更新Gotham City窗台的员工将 999,999 更改为 1,000,000,数字读取为 1,000,999。
如果区域老板不能喊“停止”,那么其他商店的员工可以在计算库存时更改计数。如果商店交换库存,这可能会导致不准确。此外,您永远不会知道某个时间的实际销售额,因为在要访问的第一个商店和最后一个商店计数之间,您在所有商店都有销售,这将改变总和的准确性。
现在,假设有区域老板和国家老板。全国老板尝试了两种方法来计算所有的销售额。她将所有区域老板的点数相加,并对所有商店进行全盘点。除非她大喊“停止”以确保没有销售,并且每个区域经理都可以进行区域计数,否则这些数字将不相等。她可以在基本过程停止的同时进行全国总计数。不幸的是,由于这需要时间和它造成的销售损失,企业破产了。
业务改革,他们决定一次只计算一个地区。区域老板或国家老板可能会为该地区大喊“停止”。当两个老板同时大喊“停止”时,就会发生锁定争用。另外,销售如何重启?老板必须大喊“GO”。如果两个老板同时进行销售计数,那么只要第一个老板完成大喊“GO”,商店就会开始倒卖。这会导致库存计数不准确(以及一次只计算一个本地区域),并且企业破产,因为他们没有产品可销售,客户感到沮丧并转向其他地方。
公司进行了改革,他们决定每次进行销售时,销售人员都会更新区域计数和国家计数。由于全国经理之前看到了一些问题,她考虑了很长时间销售人员将如何更新这些计数。他们购买了一台机器,每次按下按钮时计数都会增加一个。正如她所知,如果员工必须查看计数,则地区和国家编号可能会在他们计算新数字时发生变化。
第二种情况有锁争用问题。锁在喊“停止”和“开始”,当多个参与者/进程想要同时使用该锁时,您会发生争用。所有情况都是atomic
. 这是更新信息的能力,以便在其他读取(或读取更新)该值时保持一致。在最后一种情况下,机器为业务提供了一个“无锁”原语,因此他们可以在不需要锁的情况下自动更新计数。
当您进行涉及多个原子值或读取和写入混合的计算时,需要使用锁。如果该值一开始就不是原子的,那么即使锁也不起作用。
推荐阅读
- node.js - Mosca MQTT 代理(node.js)与 MongdoDB
- python - 从列表中转换列名
- postgresql - 如何为 docker-compose 和 DockerFile 设置不同的上下文
- python - 如何提高 pandas Pivot 速度?
- yarnpkg - 从 CodeArtifact 安装私有 npm 包失败,带有 yarn 和 yarn.lock 的“401 Unauthorized”
- python - 为什么计算机会生成这么多随机位置?
- azure - az acr build 要求
范围 - java - 如何正确设置此端点?
- tailwind-css - 尾风CSS | 如何在配置文件中设置正确的颜色以呈现为 RGB/RGBA
- angular - 计数行变量的值给我 undefined 虽然我分配了它?