• 死锁


    一、什么是死锁

      

      1、一直等待对方释放锁的情况就是死锁。

      2、类似于男女之间吵架的情况,双方一直等待对方道歉的情况。

    二、死锁的使用

      

      1、要求:多线程同时根据下标在列表中取值,要保证同一时刻只能有一个线程去取值。

      

      2、列锁示例:

      

      

    from threading import *
    
    g_num = 0
    
    # 创建锁
    mutex = Lock()
    
    
    def get_value(index):
    
        # 上锁
        mutex.acquire()
        my_list = [10,20,30]
        # 判断上标是否越界
        if index >= len(my_list):
            print("下标越界:", index)
            return
    
        value = my_list[index]  # 根据下标取值
        print(value)
    
        # 释放锁
        mutex.release()
    
    
    if __name__ == '__main__':
    
        for i in range(10): # 循环创建10个线程
            t = Thread(target=get_value,args=(i,))
            t.start()
    View Code

    运行结果:

    造成死锁的原因:

     

    其中一个线程执行到第一次下标越界后,通过return就结束了,但是它之前创建的锁并未被释放后面的线程都在等待锁释放,所以出现了死锁的情况。

     

    解决死锁的方法:

    在【下标越界】的情况下也要加上释放锁的代码

    from threading import *
    
    g_num = 0
    
    # 创建锁
    mutex = Lock()
    
    
    def get_value(index):
    
        # 上锁
        mutex.acquire()
        my_list = [10,20,30]
        # 判断上标是否越界
        if index >= len(my_list):
            print("下标越界:", index)
            mutex.release() # 在下标越界的代码处释放锁
            return
    
        value = my_list[index]  # 根据下标取值
        print(value)
    
        # 释放锁
        mutex.release()
    
    
    if __name__ == '__main__':
    
        for i in range(10): # 循环创建10个线程
            t = Thread(target=get_value,args=(i,))
            t.start()
    View Code

    运行结果:

  • 相关阅读:
    SQLServer 可疑
    String与Long互转
    洛谷 P5644
    洛谷 P3783
    洛谷 P4663
    洛谷 P3438
    Atcoder Grand Contest 054 题解
    迭代器失效问题
    Solution -「CF 232E」Quick Tortoise
    Solution -「NOI 2020」「洛谷 P6776」超现实树
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14305007.html
Copyright © 2020-2023  润新知