python使用锁访问共享变量

    python 做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon中的threading模块提供了lock对象,lock中的acquire方法用于获取一个锁,而release用于释放一个锁。当一个线程取得锁时,它变获得了共享变量的访问权,此时进入阻塞状态,若其它线程申请访问这个变量,则必须等到这个线程调用release方法释放这个锁。下面是python中使用锁的实例:

#!/usr/bin/env python
import threading,time
q=threading.Lock()   #create a lock object
def mythread():
	global a
	q.acquire()      #acquire the lock
	a=threading.currentThread().getName()
	print "a is modified by",a
	q.release()      #release the lock
	
for i in range(1,4):
	t=threading.Thread(target=mythread,name="Thread %d"%i)
	t.start()

    如果一个线程想多次获取资源访问权,在上面的程序中连续两次使用acquire(),将会造成死锁现象,因为第一次申请到的资源还没有来得及释放,就进行了第二次申请。python中的threading模块提供了可重入锁RLock,RLock提供了计数器。一个线程申请到某个资源,计数器会加1,释放掉这个资源计数器会减1.这样,一个线程可以多次请求同一个资源,在所有请求都被释放后,其它线程才允许获取这个锁。上面的代码做简单修改,可得:

#!/usr/bin/env python
import threading,time
q=threading.RLock()        #create a lock object
def mythread():
	global a
	q.acquire()       #acquire the lock
	a=threading.currentThread().getName()
	print "a is modified by",a
	q.acquire()
	a=threading.currentThread().getName()
	print "a is modified by %s the second time"% a
	q.release()     
	q.release()        #release the lock
for i in range(1,4):
	t=threading.Thread(target=mythread,name="Thread %d"%i)
	t.start()


 

你可能感兴趣的:(python&perl,锁,python,多线程)