面试题答案
一键面试使用threading.Lock
实现安全修改
import threading
shared_dict = {'count': 0}
lock = threading.Lock()
def increment():
global shared_dict
with lock:
shared_dict['count'] += 1
threads = []
for _ in range(10):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(shared_dict['count'])
同步机制及其原理
threading.Lock
:这是Pythonthreading
模块提供的一种基本的同步原语。- 原理:
Lock
有两种状态,锁定(locked)和未锁定(unlocked)。当一个线程获取到锁(调用lock.acquire()
)时,锁的状态变为锁定,其他线程在尝试获取锁时会被阻塞,直到该锁被释放(调用lock.release()
)。with lock:
语句是一种更简洁的使用方式,它会自动在代码块开始时获取锁,在代码块结束时释放锁。这样可以确保在任何时刻,只有一个线程能够进入临界区(这里是修改shared_dict['count']
的代码块),从而避免数据竞争。
- 原理:
在上述代码中,increment
函数每次执行shared_dict['count'] += 1
操作前,先获取锁,操作完成后释放锁,这样就保证了多个线程对shared_dict['count']
的修改是安全的。