前言
多线程编程最需要注意的是两个点:1.线程同步,2.竞争资源互斥访问。同步,更多的是指线程之间的协同,比如线程B的工作依赖于线程A的结果,即线程之间具有依赖协同的关系。互斥,指的是多个线程对临界资源的访问而产生互斥的关系。这种访问的方式可以是读,也可以是写。举个简单的例子:
这里有两种工作线程,一种Producer,负责向Buffer里面放资源(假设是一个整数)。另一种是Consumer,负责从Buffer里面取出资源来做一些计算。Buffer,可以理解为一个存资源的地方,大小为100。Producer和Consumer可以有多个。那么这里就同步和互斥的问题了。首先,不官是生产者还是消费者,都需要对Buffer进行互斥访问,这是对Buffer这个资源本身而言,可以用一个二值信号量(mutex)来控制对Buffer的互斥访问。其次,对Buffer里面的资源(整数)的访问也需要进行控制。如:Buffer初始为空时,对生产者而言,它有100个资源(空位)可以使用。而对于消费者而言,它能使用的资源个数则为0(Buffer里面没有数可以取)。所以可以使用信号量(Semaphore)来分别表示可用资源的多少。(具体参考《操作系统》相关书籍的互斥和同步章节)
下面进入我们的正题,谈谈python中threading.Lock的使用。
threading.Lock
先上一段代码
import threading
ticket_lock = threading.Lock()
ticket_nums = 20
class SaleTicketThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
print "init thread:%s" % self.name
def run(self):
global ticket_nums
while ticket_nums > 0:
ticket_lock.acquire()
ticket_nums = ticket_nums - 1