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 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算