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 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页