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 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同