并发编程之死锁

死锁

死锁指的是某个资源占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态

产生死锁的情况:

对同一把互斥锁加锁的多次(对同一个)

# 对同一个互斥锁多次执行acquire 可能导致死锁,情况如下:
from threading import Lock
l = Lock()

l.acquire()
# 第一个任务
print("task run")
print("over")
# l.release()         # 当这个步骤忘记写了之后,l这把锁,就会出现死锁的情况

l.acquire()
# 第二个任务
print("task1 run")
print("over1")
l.release()

死锁的另外一种情况:

from threading import Lock,Thread
import time
lock_one = Lock()
lock_two = Lock()

def eat1():
    lock_one.acquire()      # 筷子
    time.sleep(0.1)
    lock_two.acquire()      # 碗

    print("开吃了 1")

    lock_one.release()
    lock_two.release()


def eat2():

    lock_two.acquire()      # 碗
    time.sleep(0.1)
    lock_one.acquire()      # 筷子

    print("开吃了 2")

    lock_two.release()
    lock_one.release()


t_one = Thread(target=eat1)
t_one.start()
t_two = Thread(target=eat2)
t_two.start()
'''
产生死锁的情况:
1. 对同一把互斥锁加锁了多次
2. 有多把锁,被不同线程或进程所持有,就会导致相互等待对方释放,程序就会卡死

对于第二种情况的解决方案:
1. 抢锁一定按照顺序抢
2. 给锁加上超时,如果超时则放弃执行
'''

结果:


posted @ 2019-07-05 17:38  Hello_Jack  阅读(474)  评论(0编辑  收藏  举报
# 页脚html代码 /*头部导航栏*/ #navigator { font-size:15px; border-bottom: 1px solid #ededed; border-top: 1px solid #ededed; height: 60px;/*导航栏高度,原始50*/ clear: both; margin-top: 25px; } /*导航栏设置,可以自定义导航栏的目录*/ #navList { min-height: 35px; float: left; } #navList li { /*每一个栏目节点*/ float: left; margin: 0 5px 0 0; /*这里原来是0 40px 0 0 */ } #navList a { /*栏目文字的格式*/ display: block; width: 5em; height: 22px; float: left; text-align: center; padding-top: 19px; }