首页 > 试题广场 >

下列哪种操作可能带来死锁?

[单选题]
下列哪种操作可能带来死锁?
  • lock(m1) lock(m2) unlock(m1) unlock(m2)
  • lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
  • lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
  • lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)
推荐
C
lock(m1) lock(m2) unlock(m1) 后如果m1被另一个进程申请到lock(m1),现在第一个进程申请m1,第二个申请m2,就会进入死锁
编辑于 2015-02-03 17:15:18 回复(5)
lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
假设A线程执行完第一步即将执行第二步:
A线程:lock(m1) -> lock(m2) 
B线程执行完第三步,即将执行第四步  
B线程:lock(m1) lock(m2) unlock(m1) ->lock(m1) 即 lock(m2) -> lock(m1)
线程A锁住了m1对象,然后尝试对m2对象进行加锁,同时线程B已经锁住了m2对象,接着尝试对m1对象进行加锁。 
这时死锁就发生了。线程A永远得不到m2,线程B也永远得不到m1。为了得到彼此的对象(A和B),它们将永远阻塞下去。
具体请参见 http://blog.csdn.net/wt_better/article/details/72765333

发表于 2017-05-30 18:14:53 回复(1)
个人表示没看懂下面大佬们的解释。

发表于 2019-04-05 10:46:20 回复(0)
题目本来就没有假设“所有线程均按照此顺序运行”,我看讨论里大家都默认了。。。没有这个假设,b也有可能死锁。😅
发表于 2019-03-23 22:59:41 回复(0)
请问b和c有什么区别吗?
发表于 2018-03-14 08:10:43 回复(0)
此题因该遵循所有线程均按照此顺序运行,这样B项就不存在问题,即使线程A失去m2,但是线程B此时还没有得到m1锁,还得继续等待A释放m1
发表于 2019-02-27 09:12:14 回复(0)
如题可以看出,m1+m2是一个线程的两个资源,先1后2是顺序。当两个线程各持有任务的一个资源后就会导致死锁。
发表于 2017-10-18 18:55:32 回复(0)
假设有两个线程,线程1执行到lock(m1),lock(m2),unlock(m1),此时线程1持有锁m2,想要获取锁m1;线程2执行到lock(m1),此时线程2持有锁m1,想要获取锁m2。两个线程都拿着对方想要得到的锁,造成死锁。
发表于 2016-05-07 11:03:34 回复(1)
答案:C。
对于序列:lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1),假设有两个操作A,B同时并行执行这个序列,
假设A执行较快,在执行第一个unlock(m1)后,切换到B执行,此时B在执行第一个lock(m1)后请求lock(m2),但A并未释放m2的锁,导致了环路等待的局面,引发死锁。



发表于 2016-04-15 09:57:39 回复(1)
1 2 3 4 5 6
lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
对于C选项:假设有A、B两个线程并发执行
当A执行完3,占有m2时,申请m1.
当B执行完1,占有m1,申请m2时
这时死锁就发生了。
发表于 2017-08-04 14:54:29 回复(3)
对于序列 :lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
画了个表格,便于理解(我也是看了答案才懂得。。。)
执行步骤 1 2 3 4 5 6
代码 lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
线程1 1执行,占有m1 1执行,占有m1 && m2 1执行,占有m2 1暂停,线程2执行
线程2 1暂停,2执行,占有m1 1暂停,2执行,占有m1,申请m2(但是被线程1占有)
线程1 1继续执行,占有m2,申请m1(被2占有)
编辑于 2021-09-02 21:11:22 回复(0)
跟我来,拿起你左边小手指头和右边小手指头来做个游戏!右手食指先开始向右移动,lock住m1,左手食指就不能再lock住m1,向右移动,直到右手unlock才可以,m2同理。结论是C选项当右手食指unlock了m1的同时,左手食指lock住m1这种情况,左、右手食指都移动不了啦!死锁。
发表于 2018-04-07 17:07:13 回复(2)
这里假定的条件应该是两个或多个线程都是按照相同的顺序来上锁和解锁。
我们以2个线程为例进行分析,假设线程1执行lock(m1),获取到锁m1。那么线程2获取不到锁m1,所以执行不了lock(m1),必须等待线程1先释放锁m1。所以,A选项,当线程1执行到lock(m1) lock(m2) unlock(m1)时,线程2才可以执行lock(m1),很明显,线程1后续不再抢占锁了,所以不会出现死锁。B选项,当线程1执行到lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1)时,线程2才可以执行lock(m1),很明显,线程1后续不再抢占锁了,所以不会出现死锁。C选项,当线程1执行到lock(m1) lock(m2) unlock(m1)时,线程2才可以执行lock(m1)。此时,如果线程2执行了lock(m1),那么线程1拥有锁m2,线程2拥有锁m1。线程1接下来要执行的操作是lock(m1),但锁m1在线程2手中,必须等线程2释放才能获取。线程2接下来要执行的操作是lock(m2),但锁m2在线程1手中,必须等线程1释放才能获取。这个时候就出现死锁的情况啦!D选项,当线程1执行到lock(m1) lock(m2) unlock(m1)时,线程2才可以执行lock(m1)。此时,如果线程2执行了lock(m1),那么线程1拥有锁m2,线程2拥有锁m1。线程1接下来要执行的操作是unlock(m2),将锁m2释放。线程2接下来要执行的操作是lock(m2),正好线程1将锁m2释放了,所以线程2可以获取锁m2。所以,在这里不会出现死锁的情况。线程1只剩下lock(m1) unlock(m1)未执行,且没有拥有锁m1和m2。那么很明显,后续的操作不会出现死锁的情况。

所以,答案选C。

编辑于 2022-08-05 14:48:18 回复(0)
发表于 2022-03-02 19:00:11 回复(0)
读懂题目是关键,选项给的就是正常写的代码,多个线程要同时执行这段代码,然后判断哪种情况会形成死锁,经过分析,就C选项会可能行程死锁。
发表于 2021-12-03 14:23:40 回复(0)
多个线程同时执行这一种程序
发表于 2021-11-23 14:10:32 回复(0)
这道题选C,听我的准没错
发表于 2021-01-10 15:31:48 回复(0)

C
死锁的条件就是,在某一线程中存在 lock(m1) 的时候想去拿 m2 的锁,和在另一线程中拥有 lock(m2) 的时候想去拿 m1 的锁。

实际的一个例子就是:

  1. 线程A: lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
  2. 线程B:lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)

上面线程A刚拿到m1锁,下一步期待拿到m2锁,而线程B(走了3步)已经拿到了m2的锁,下一步期待拿到m1锁。

发表于 2020-04-09 15:55:14 回复(0)
链接:https://www.nowcoder.com/questionTerminal/c572bb54bf4a44dea62d28fa0ae7e8f0
来源:牛客网
lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
对于C选项:假设有A、B两个线程并发执行
当A执行完3,占有m2时,申请m1.
当B执行完1,占有m1,申请m2时
这时死锁就发生了。
发表于 2019-12-11 14:03:13 回复(0)
这种存在死锁的情况,就看是否有lock1,lock2和lock2,lock1这种对出现
发表于 2019-04-16 23:49:45 回复(0)
有点混乱,但是B选项好像也会死锁啊,再unlock(m2)之后 如果另外线程锁了m2有请求m1,不也会锁
发表于 2018-10-29 21:53:16 回复(0)