zoukankan      html  css  js  c++  java
  • 死锁

    一、什么是死锁

      

      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

    运行结果:

  • 相关阅读:
    Oracle:Using the DBMS_STATSpackage
    Oracle partitioning is not always a good idea.
    Oracle: Benefits and consequences of the NOLOGGING option
    Oracle :Insert ways.
    Oracle:临时表的统计信息
    C#中使用DTS来导入数据及相关问题
    [收藏]CSS网页制作时实现自动换行的小技巧
    新加了牛人的Blog链接
    在.Net下使用Access 的日期类型 及与js的日历控件交互
    在程序中生成PDF
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14305007.html
Copyright © 2011-2022 走看看