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

线程锁中关于死锁的疑问

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

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条回答 默认 最新

  • 关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)