Love And Program
2021-06-27 16:43
采纳率: 71.4%
浏览 12
已采纳

线程锁中关于死锁的疑问

我在学习线程的时候发现这样一个问题

import time 
import threading
import time


def test1():
    
    mA.acquire()
    print("test1--上锁A")
    time.sleep(1)
    mB.acquire()
    print("test1---上锁B")
    mA.release()
    print("test1---解锁A")
    mB.release()
    print("test1---解锁B")


def test2():
    mB.acquire()
    print("test2---上锁B")
    time.sleep(1)
  #  mA.acquire()
    print("test2--上锁A")
  #  mA.release()
    print("test2---解锁B")
    mB.release()
    print("test2---解锁A")


mA = threading.Lock()
mB = threading.Lock()
def main():
    t1 = threading.Thread(target=test1)
    t2 = threading.Thread(target=test2)
    t1.start()
    t2.start()


if __name__ == '__main__':
    main()

他给我返回的结果并没有造成死锁,打印的以下内容,可是为什么test2会在test1前面呢?

test1--上锁A
test2---上锁B
test2--上锁A
test2---解锁B
test2---解锁Atest1---上锁B

test1---解锁A
test1---解锁B

为什么会有这个疑问呢?因为当我把test1里面的注释掉以后结果成了以下,而不是死锁,也就是没有和test2等待有一秒后产生作用,这算什么情况,是有优先级么?以我的想法不应该是两个函数的语句轮换着出现或是直接产生死锁么?

def test1():
    
    mA.acquire()
    print("test1--上锁A")
    time.sleep(1)
 #   mB.acquire()
    print("test1---上锁B")
    mA.release()
    print("test1---解锁A")
 #   mB.release()
    print("test1---解锁B")


def test2():
    mB.acquire()
    print("test2---上锁B")
    time.sleep(1)
    mA.acquire()
    print("test2--上锁A")
    mA.release()
    print("test2---解锁B")
    mB.release()
    print("test2---解锁A")

test1--上锁A
test2---上锁B
test1---上锁B
test1---解锁A
test1---解锁B
test2--上锁A
test2---解锁B
test2---解锁A

希望大佬们帮忙解释一下,感激不尽。

这难道还有趋利避害不成(笑哭笑哭)

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • 最佳回答

    线程的运行是不确保运行顺序的,所以出现的顺序是随机的。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题