gpt4 book ai didi

multithreading - 竞争条件和死锁之间的区别

转载 作者:行者123 更新时间:2023-12-02 07:17:38 24 4
gpt4 key购买 nike

在编程术语中,死锁和竞争条件有什么区别?

最佳答案

使用传统示例来考虑竞争条件。假设您和一位 friend 拥有同一个银行账户的 ATM 卡。现在假设帐户中有 100 美元。考虑一下当您尝试提取 10 美元而您的 friend 同时尝试提取 50 美元时会发生什么。

想想将会发生什么。 ATM 机必须接受您的输入,读取您帐户中当前的内容,然后修改金额。请注意,在编程术语中,赋值语句是一个多步骤过程。

因此,将您的两笔交易标记为 T1(您提取 10 美元)和 T2(您的 friend 提取 50 美元)。现在,下面左侧的数字代表时间步长。

       T1                        T2
---------------- ------------------------
1. Read Acct ($100)
2. Read Acct ($100)
3. Write New Amt ($90)
4. Write New Amt ($50)
5. End
6. End

两笔交易完成后,使用此时间线(如果您不使用任何类型的锁定机制,这是可能的),帐户中有 50 美元。这比应有的金额多了 10 美元(您的交易将永远丢失,但您仍然有钱)。

这就是所谓的竞争条件。您想要的是事务可串行,也就是说,无论您如何交错各个指令执行,最终结果都将与某些串行调度完全相同(意味着您一个接一个地运行它们,没有交错)相同的事务。解决方案再次是引入锁定;但是不正确的锁定可能会导致死锁。

当共享资源发生冲突时,就会发生死锁。这有点像第 22 条军规。

   T1            T2
------- --------
1. Lock(x)
2. Lock(y)
3. Write x=1
4. Write y=19
5. Lock(y)
6. Write y=x+1
7. Lock(x)
8. Write x=y+2
9. Unlock(x)
10. Unlock(x)
11. Unlock(y)
12. Unlock(y)

您可以看到在时间 7 发生了死锁,因为 T2 尝试获取 x 上的锁,但 T1 已经持有 x 上的锁,但它正在等待T2 持有 y 的锁。

这很糟糕。你可以把这个图变成依赖图,你会发现有一个循环。这里的问题是 x 和 y 是可以一起修改的资源。

防止多个锁对象(资源)出现此类死锁问题的一种方法是引入排序。您会看到,在前面的示例中,T1 锁定了 x,然后锁定了 y,但 T2 锁定了 y,然后锁定了 x。如果两个事务都遵守某种排序规则,即“x 应始终在 y 之前锁定”,则不会发生此问题。 (您可以根据此规则更改前面的示例,并且不会出现死锁)。

这些都是微不足道的例子,实际上我只是使用了你可能已经看过的例子,如果你学过这方面的任何本科类(class)的话。实际上,解决死锁问题可能比这困难得多,因为您往往拥有多个资源和多个交互的事务。​​

一如既往,使用维基百科作为 CS 概念的起点:

http://en.wikipedia.org/wiki/Deadlock

http://en.wikipedia.org/wiki/Race_condition

关于multithreading - 竞争条件和死锁之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3130079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com