5.1.2 线程锁

a += 1 这样的语句,是线程不安全的,因为它不是原子性操作。如果想保证某段代码最多同时被一个线程执行,可以给它加锁:

i = 0
lock = threading.Lock()

def think():
    global i
    lock.acquire()
    i += 1
    lock.release()

注意到这里的加锁和释放锁又是上下对应的模板代码,这类代码都可以用 with 块配合上下文解决。Python 提供了现成的写法:

lock = threading.Lock()

def think():
    global i
    with lock:
        i += 1

threading.Lock 类的 __exit__方法中会自动释放锁。

Last updated