Python死锁和可重入死锁
来源:互联网 发布:zram内存优化如何修改 编辑:程序博客网 时间:2024/06/05 13:21
#!/usr/bin/env pythonimport threadingimport timeclass MyThread(threading.Thread): def do1(self): global resA,resB if mutexA.acquire(): msg=self.name+'got resA' print msg if mutexB.acquire(1): msg=self.name+'got resB' print msg mutexB.release() mutexA.release() def do2(self): global resA,resB if mutexB.acquire(): msg=self.name+'got resB' print msg if mutexA.acquire(1): msg=self.name+'got resA' print msg mutexA.release() mutexB.release() def run(self): self.do1() self.do2()resA=0resB=0mutexA=threading.Lock()mutexB=threading.Lock()def test(): for i in range(5): t=MyThread() t.start()if __name__=='__main__': test()
可重入死锁
import threadingimport timeclass 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=0mutex=threading.Lock()def test(): for i in range(5): t=MyThread() t.start()if __name__=='__main__': test()为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:
import threadingimport timeclass 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=0mutex=threading.RLock()def test(): for i in range(5): t=MyThread() t.start()if __name__=='__main__': test()
阅读全文
0 0
- Python死锁和可重入死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- C#基础(19)——path、File类的基本操作
- 1129. Recommendation System (25)
- javascript 函数
- 计蒜客 非递归二叉树的前序遍历(树结构)
- Java 文件路劲获取(流的方式),适用与jar包或war包运行方式
- Python死锁和可重入死锁
- 角点检测--harris
- 常用算法程序集(c/c++)笔记(一)
- springboot第一个应用hello
- 【小白的CFD之旅】15 四种境界
- 14.Spark SQL:UDAF自定义聚合函数实战
- 我的学习记录37
- c指针6
- SELinux