21

最近,我发现自己不得不写下我对正在开发的应用程序中的竞争条件的一些担忧(不是我自己写的)。这可能会引起非技术利益相关者的注意,并且与我没有直接的沟通渠道,因此我的解释需要以书面形式。

我已经尝试过写这篇文章。我尽我所能掩盖技术细节,举例说明竞争条件如何在应用程序中发生,并描述其影响。我觉得我做得很好,但远非完美。

问题是,尽管我试图让读者远离计算机科学,但我仍然发现很难在不失去正确性和实质的情况下消除“执行线程”和“互斥”等短语。风险在于,如果挥手过多,这些担忧可能会被认为是虚构的恶作剧。

无论如何,我对你的问题是: 你将如何非技术观众解释比赛条件? 你敢解释 CPU 调度吗?你会请吃饭的哲学家吗?

你不必在我的情况下工作(但如果你这样做会非常有帮助)。

4

18 回答 18

25

X 公司在银行有 1,000 美元。X 支付了 2,000 美元的租金,并因向 Y 公司提供服务而收到了 10,000 美元的付款。但是,由于竞争条件,X 亏损 1,000 美元,现在正在申请破产。=(

您可能想解释银行如何以这种方式处理公司 X 的账户:银行员工 A 取当前价值 1,000 美元并在其中添加 10,000 美元。银行职员 B 取当前价值 1,000 美元并从中减去 2,000 美元。银行工作人员 A 将值更新为 11,000 美元。银行工作人员 B 将值更新为 -$1,000。

于 2008-11-21T21:56:17.340 回答
11

我认为银行交易可能是一个很好的例子,因为很容易看出不正确的结果是不好的,而且因为在这样的环境中很容易创建竞争条件。

我的账户上有 500 美元。在我提取 50 美元的同时,有人将 200 美元转给我。

现在,如果银行没有正确处理竞争条件,他们将执行以下操作(当然,假设交易是手动处理的) 店员 A 将看到向我的余额添加 200 美元的请求,并注意我的余额目前是 500 美元. 职员 B 将看到从我的余额中减去 50 美元的请求,并注意到我的余额目前为 500 美元(职员 A 尚未转帐)。

职员 A 完成了文书工作并将我的帐户余额设置为 700 美元(500 + 他应该添加的 200)。然后,一分钟后(因为店员 B 只需要喝杯咖啡),店员 B 完成了另一笔交易并将我的余额设置为 450 美元(他检查时我的 500 减去他要减去的 50 )。

我的余额现在是 450 美元,本来应该是 650 美元,因为比赛条件。结果取决于执行两个事务的不同部分的顺序。

这是对比赛条件如何糟糕的一般描述。现在说,我们让我们的应用程序同时处理两个单独的任务(那是你的“执行线程”)而不是文员,就像上面一样,他们都读取一个值,修改他们读取的值,然后写入回来了。如果按照上面显示的顺序发生这种情况,其中一项修改可能会丢失。这应该与您的应用程序中的特定问题相关联。

于 2008-11-21T22:12:55.857 回答
2

我会采用餐饮哲学家式的方法,但根据我的观众,我会尝试将其类比为我的观众的背景。您是在与企业高管交谈吗?然后将其类比为分配会议室或公司用车或预订酒店房间等。你是在和普通人说话吗?那么餐饮哲学家的例子很好,或者你可以想出一个类似的情况,包括照顾农场动物或坐在椅子上等等。

无论你是劫持餐饮哲学家的例子,还是自己编造,一定要用比喻。

于 2008-11-21T21:51:44.837 回答
2

如果您正在写信给非技术人员,您将希望简化您的解释并将其与他们可以理解的内容联系起来。一种解释取自《向没有经验的程序员教授并行计算的类比》一文 ( http://portal.acm.org/citation.cfm?doid=1189136.1189172 ) 用笔游戏来解释它:

我们要玩一个叫做笔游戏的游戏。规则很简单:我手里拿着一支笔,然后我会说“一,二,三,走。” 当我说“去”时,把笔从我手里拿走。谁拿到笔就赢了。准备好?一,二,三,走。

然后你问这个游戏的结果是否可以提前预测。如果无法预测,我们能保证正确的结果吗?这应该导致意识到同时写入同一块内存可能会得到不正确的结果。

于 2008-11-21T21:57:59.740 回答
2

我本来打算推荐餐饮哲学家,但我看你已经找到了。那么,作为替代方案,如何使用僵局作为类比呢?

想象一下沿着单个城市街区(北大街、南大街、东大街和西大街)旁边的四条街道行驶的正常交通。当路上只有一两辆车时,一切都顺利进行。当交通稳定时,一些汽车将不得不停下来等待其他汽车驶过,但这是一个可以控制的问题。一辆车停下来等另一辆车经过,然后继续行驶。

现在,想象一下同一地点的高峰时段交通情况。假设一辆在西街向南行驶的汽车无法一路穿过我们街区西北角的十字路口。那辆车现在挡住了北大街上所有的西行交叉交通。没过多久,一辆西行车试图通过东北角的十字路口并被卡住,阻塞了东街的所有北行交通。这种情况,绕到四个路口,车子都不能动!每个人都在等待前面的汽车向前行驶,但如果不将汽车向后拉出,就无法解除僵局。

与计算的比较应该是直截了当的。汽车是线程或进程,街道和大道是处理器、缓冲区或内核。阻塞的概念可以用交通信号灯或停车标志来描述,整个事情开始变得直观起来,即使对非程序员来说也是如此。

于 2008-11-21T22:05:44.107 回答
2

编写一个程序:

  1. 等发工资。
  2. 去商店。
  3. 买食物。
  4. 打开盘子。
  5. 把食物放在盘子里。
  6. 保持盘子20分钟。
  7. 吃。
  8. 睡觉。

现在尝试让两个线程(你,妻子)在不同步的情况下执行它。

  • 你:等工资吧。
  • 老婆:没钱去店里,撞车

  • 你:开盘。

  • 你:保持盘子20分钟。
  • 你去睡觉。

  • 妻子:在别人家吃饭。

  • 妻子:去睡觉吧。
于 2008-11-21T22:51:25.187 回答
1

显而易见的呢?

比赛条件实际上是两个人之间的比赛。

一家公司正在投标一个项目。两名独立工作的员工将投标提交给客户,但其中一名员工的信息已过时。两名员工都不知道对方正在提交投标,因此根据谁的速度更快,第一个投标可能会被速度较慢的员工取代。这将导致混淆,因为出价可能会随着时间而改变。

两名员工之间需要进行沟通,以共同工作或阻止其中一名员工。

于 2008-11-21T21:56:36.560 回答
1

彼得想离开他的车道。他检查了他的车上没有任何东西,然后上车。他的儿子弗兰克然后躲在车后面。彼得看不见他,把他撞了过去。

这里重要的是,对于一台计算机,“检查”和“修改”往往是两个独立的操作,所以一个当你修改它时不能检查的例子是一个很好的例子。

于 2008-11-21T23:00:39.050 回答
1

解释一般概念的一个困难是竞争条件在各种各样的情况下表现出来。如果您的目标是让您的非技术受众感觉到这是一种通用问题类型,那么您应该尝试提供多个示例。

于 2008-11-22T00:07:09.387 回答
1

一张图片值一千字。这是真的。如果您绘制时间线并在其上放置一些实体,并显示其状态随着时间的推移而变化,您可以在一张图中很容易地演示竞争条件。可能需要重做几次才能使图片恰到好处,但我总是发现画出来比描述它更能传达我的观点。

于 2008-11-22T01:27:06.213 回答
0

操作系统应用程序的结构化并发编程中有一个很好的例子(我记得)

在贫穷的贝泽克斯坦,两条线路在一条隧道中汇合到一条轨道上。发生了冲突,执政的军政府需要一个解决方案。

问题是它多山,工程师是盲目的。几乎没有两列火车即将在隧道内相撞的预警。

这是计划。

  1. 把一个大碗放在接合处。

  2. 给每个工程师一只黄铜小猴子。

当你即将进入隧道时,你停下了你的火车。你在碗里拍拍,看看碗里是否有一只黄铜猴子。

如果有猴子,其他人正在使用隧道,所以你必须等到他们的火车完全在隧道中,然后列车员从车尾出来,从碗里抓住猴子。

如果没有猴子,就没有其他人在使用隧道。因此,您可以从发动机舱中抓起您的猴子,将其放入碗中,然后开车穿过隧道,因为您已经获得了对赛道的独家访问权。当然,你短暂停留让售票员取回黄铜猴子。

你猜怎么了?

他们仍然有碰撞!

为什么?导致此失败的情况或操作顺序是什么?


这是一个竞赛条件。

在书面文件中,您可以解释比赛条件如何导致事故。

在演示文稿中,您可以通过推理并发和锁定来指导听众。

于 2008-11-21T22:27:08.697 回答
0

我认为很难用简单的方式来解释这一点,因为考虑并发性本来就很难。金融交易的基本概念可能是一个很好的起点,因为人们会从现实生活中对它们有所了解。

在任何类型的交易中,您都需要在两个地方同时输入 - 借方和贷方。如果交易在中间被其他人试图执行另一笔交易而中断,他们将在一个或另一个账户中看到错误的余额。

于 2008-11-21T22:33:02.133 回答
0

我将使用数据竞争条件的共享内存银行帐户示例。

解释计算机执行以下操作:负载平衡;加1;存储余额;。考虑两个正在修改您的银行帐户余额的线程(您和您的妻子同时存入一美元)。

如果两个线程在以下之后中断:负载平衡;然后恢复,你可以损失一美元。

见:http ://wasp.cs.washington.edu/atomeclipse/handouts.pdf

于 2008-11-21T23:31:39.363 回答
0

正如您所提到的,您经常需要引入其他概念(互斥、执行线程)来准确描述竞争条件,即使是在隐喻中也是如此。因此,首先尝试使用隐喻来定义这些术语(或至少让想法得到理解)。

举个简单的例子,让我们使用一个 4 路交叉口(设置在您在右侧行驶的国家/地区)。将交叉口分为 4 个象限:西北、东北、东南和西南。现在将每个象限称为资源,并将每辆车称为执行线程。这些汽车只尊重交通系统,由于这个十字路口没有停车标志或交通信号灯,汽车直接通过而不会减速或考虑交通。

你可以很容易地证明,不止一辆汽车同时使用这些象限之一是不好的,并导致车祸。一个明显的解决方案是安装交通系统。该系统确保不超过一辆车同时通过一个象限。它可以错综复杂地做到这一点,而不会占用所有资源。例如,让来自南方的汽车左转向西(使用东南和西北象限),而让来自西方的汽车右转向南(使用西南象限) . 交通系统提供互斥,或防止(多辆汽车)同时使用公共资源(交叉路口的道路象限)。

这至少提供了这些定义背后的想法,即同时访问共享资源可能是不好的想法,而互斥可以解决这个问题。确定后,您需要将这些映射到更合适的隐喻,以显示竞争条件是什么以及它是如何因缺乏对公共资源的互斥而导致的坏事之一。

这需要更长的时间,但在深入研究更复杂的隐喻之前,它可以让您熟悉术语和大局。

于 2008-11-22T00:08:50.270 回答
0

与您的利益相关者谈论金钱可能会使他们陷入恐慌状态,特别是如果他们认为他们因此而损失了实际金钱,如果问题没有特别导致利润净损失,这并不完全理想,所以这里有一个不太注重财务的关于如何向任何人解释比赛条件的故事。

这个故事没有解决死锁的概念,而是更传统的竞争条件场景和后果。

故事从这里开始:

那个设定:有3个城市通过铁路网相连。火车上没有任何标志表明他们来自哪个城市以及他们要去哪个城市,因为它们在所有 3 个城市之间使用,而且铁路网络不想处理所有更换标志的麻烦时间。由于网络很小,没有关于火车何时到达和离开的具体时间表。站长只是在火车开出时接到其他城市站长的电话,站长会记下它离开的时间,并且由于所有火车都是相同的型号,因此它们以相同的速度行驶,因此当站长收到来自其他城市的电话,他们向车站里的人宣布:“下一班火车将开往 C 市”。所以想去C市的人等着火车,

问题:但有一天,一列火车正在规划从A到B到C的路线,它在A和B之间的中途抛锚了。幸好技术人员非常熟练,很快就能把火车修好。然而就在同一天,另一列火车也在计划从C到B再到A的不同路线。B站的监督接到A的电话,说有火车来了,不久又接到C的电话,说另一列火车也来了。站长随即对在车站等候的乘客宣布:“第一班到站的列车将开往C站,之后的列车将开往A站。” 随着乘客们收拾行李,前往各自的站台。监工看到一列火车来了,把铁轨改到人们计划前往C市的站台上。他们几乎不知道火车实际上是开往A市的。修好机械故障的另一列火车也到了车站,监工兴高采烈地把它引到站台上,站台上有想去A市的乘客。不用说,没有一个乘客到达他们计划去的地方,这一切都是因为监督认为他们会像往常一样按顺序到达。

于 2015-04-15T13:16:16.020 回答
0

竞争条件和许多计算机科学结构的问题在于人不是计算机。每次我向我的学生解释一种算法时,他们都会说“但那样做没有意义”,我回答说“计算机没有常识,它们只有指令”。除此之外,您应该将比赛条件解释为比赛,如果可以的话,让人们实际尝试比赛是最有意义的。这样他们就可以看到事情是如何出错的。但是……他们不被允许使用常识。

所以让我们假设我们有一个游戏,其中 2 个人按照红色、橙色、黄色的顺序填充一堆彩色块。它们有许多红色、橙色和黄色块。所有的堆栈都需要正好是三个方块高。

在第一场比赛中,双方都试图尽可能快地做到这一点,但他们只在自己的堆栈上工作。

在第二场比赛中,他们尝试通过允许自己也将积木堆叠在彼此的堆叠上来一起工作。但是他们不允许改变他们手中的块,他们必须放置一个计划好的块。

你可以想象这样的情况发生在堆栈 1 中:

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

所以现在我们有一个带有两个橙色块的堆栈。很明显,在人类游戏中,这永远不会发生,因为人们有常识:他们看到橙色块已经放置,并恢复他们也放置橙色块的决定。

你也可以给他们看这个视频:https ://www.youtube.com/watch?v=TcGwNdbsAbc

于 2016-03-09T17:33:39.137 回答
0

让我们使用白板来完成一项琐碎的会计任务。我们手头有 100 美元——把它写在白板上。

爱丽丝有几十张发票,加起来是 100 美元,所以她要记下 100 美元,去把她的清单加起来,然后在 5 分钟后回来,在黑板上写下 200 美元。

鲍勃一直在购物。他会从白板上取出那个数字,然后减去价值 50 美元的购买,然后他会在白板上写下 50 美元。

如果 Bob 先回来,我们将在 Alice 写出结果后看到 200 美元。如果爱丽丝先回来,我们将看到 50 美元,也是错误的。我们希望看到的是 150 美元,我们需要在某处添加一些预防措施以实现这一目标。

这应该足以用合理的直觉来讨论技术解决方案。

例如,互斥锁意味着你锁住房间的门,里面有白板,让他们在那里做他们的工作。一个乐观的解决方案意味着你让他们都检查并重新开始,如果他们离开时数字发生了变化。如果你想谈论死锁,你可以嘲笑 Bob 从锁着的房间里打电话给 Alice 让她快点。

于 2016-05-03T22:51:44.563 回答
-1

将它们发送到Wikipedia 上的Race Condition

第一部分会有些意义,其余部分(下面未显示)会让你看起来很聪明,因为他们会假设你理解它。

“竞态条件或竞态危害是系统或过程中的缺陷,其中过程的输出和/或结果出乎意料地严重依赖于其他事件的顺序或时间。该术语起源于两个信号各自竞争的概念其他先影响输出。”

我认为要理解的关键点是,它最常见的时间问题可能是不可预测的,因为时间有时会有所不同。

于 2008-11-22T00:30:11.117 回答