zoukankan      html  css  js  c++  java
  • 死锁 与 递归锁

    进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额

    所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

     1 from threading import Lock as Lock
     2 import time
     3 mutexA=Lock()
     4 mutexA.acquire()
     5 mutexA.acquire()
     6 print(123)
     7 mutexA.release()
     8 mutexA.release()
     9 
    10 死锁

    解决方法,递归锁,在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

    这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

    from threading import RLock as Lock
    import time
    mutexA=Lock()
    mutexA.acquire()
    mutexA.acquire()
    print(123)
    mutexA.release()
    mutexA.release()
    
    递归锁RLock

    典型问题: 科学家吃面

     1 import time
     2 from threading import Thread,Lock
     3 noodle_lock = Lock()
     4 fork_lock = Lock()
     5 def eat1(name):
     6     noodle_lock.acquire()
     7     print('%s 抢到了面条'%name)
     8     fork_lock.acquire()
     9     print('%s 抢到了叉子'%name)
    10     print('%s 吃面'%name)
    11     fork_lock.release()
    12     noodle_lock.release()
    13 
    14 def eat2(name):
    15     fork_lock.acquire()
    16     print('%s 抢到了叉子' % name)
    17     time.sleep(1)
    18     noodle_lock.acquire()
    19     print('%s 抢到了面条' % name)
    20     print('%s 吃面' % name)
    21     noodle_lock.release()
    22     fork_lock.release()
    23 
    24 for name in ['哪吒','egon','yuan']:
    25     t1 = Thread(target=eat1,args=(name,))
    26     t2 = Thread(target=eat2,args=(name,))
    27     t1.start()
    28     t2.start()
    29 
    30 死锁问题
     1 import time
     2 from threading import Thread,RLock
     3 fork_lock = noodle_lock = RLock()
     4 def eat1(name):
     5     noodle_lock.acquire()
     6     print('%s 抢到了面条'%name)
     7     fork_lock.acquire()
     8     print('%s 抢到了叉子'%name)
     9     print('%s 吃面'%name)
    10     fork_lock.release()
    11     noodle_lock.release()
    12 
    13 def eat2(name):
    14     fork_lock.acquire()
    15     print('%s 抢到了叉子' % name)
    16     time.sleep(1)
    17     noodle_lock.acquire()
    18     print('%s 抢到了面条' % name)
    19     print('%s 吃面' % name)
    20     noodle_lock.release()
    21     fork_lock.release()
    22 
    23 for name in ['哪吒','egon','yuan']:
    24     t1 = Thread(target=eat1,args=(name,))
    25     t2 = Thread(target=eat2,args=(name,))
    26     t1.start()
    27     t2.start()
    28 
    29 递归锁解决死锁问题
  • 相关阅读:
    PLSQL Developer调试 存储过程和触发器
    oracle 根据汉字返回拼音函数
    Oracle Length 和 Lengthb 函数说明 .(用来判断记录值里是否有中文内容)
    getline()函数
    自编Photoshop简单教程
    Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/ma ven/cli/Maven
    android 动态设置TextView值,例:金额添加
    JavaScript定时调用函数(SetInterval与setTimeout)
    Json数据的序列化与反序列化的三种经常用法介绍
    手动脱FSG壳实战
  • 原文地址:https://www.cnblogs.com/frank007/p/9936694.html
Copyright © 2011-2022 走看看