python死锁案例_python 模拟死锁

python 模拟死锁

#

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。

如下例子:

第一个方法 lock_1 先获取 mutexA 锁,访问全局变量 globalvarA ,然后 acquire mutexB 锁

第二个方法 lock_2 先获取 mutexB 锁,访问全局变量 globakvarB ,然后 acquire mutexA 锁

当出现如下情况时发生死锁:

1. 某个线程执行到 lock_1 方法的 mutexB.acquire(1) 语句时,另一线线程执行 lock_2 方法的 mutexA.acquire(1)

由于线程是无序的,因此可能发生这种情况。

# encoding: UTF-8

import threading

import time

class MyThread(threading.Thread):

def lock_1(self):

global globalvarA, globalvarB

if mutexA.acquire():

msg = self.name+' got globalvarA'

print (msg)

if mutexB.acquire(1):

msg = self.name+' got globalvarB'

print (msg)

mutexB.release()

mutexA.release()

def lock_2(self):

global globalvarA, globalvarB

if mutexB.acquire():

msg = self.name+' got globalvarB'

print (msg)

if mutexA.acquire(1):

msg = self.name+' got globalvarA'

print (msg)

mutexA.release()

mutexB.release()

def run(self):

self.lock_1()

self.lock_2()

globalvarA = 0

globalvarB = 0

mutexA = threading.Lock()

mutexB = threading.Lock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

执行命令

#

# 可能需要多次执行,因为线程的无序

python34 deadlock.py

结果

#

执行如上命令后,观察到已经进入死锁,光标在闪烁,无法获取下一个lock

OS上观察进程还在

[root@ ~]# ps -ef|grep -v grep|grep dead

root     19272 18226  0 11:53 pts/1    00:00:00 python34 deadlock.py

[root@ ~]#

一个线程“迭代”请求同一个资源,直接就会造成死锁

import threading

import time

class MyThread(threading.Thread):

def run(self):

global num

time.sleep(1)

if mutex.acquire(1):

num = num+1

msg = self.name+' set num to '+str(num)

print (msg)

mutex.acquire()

mutex.release()

mutex.release()

num = 0

mutex = threading.Lock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值