推荐答案
// www.javascriptcn.com code example
import threading
# 创建一个锁对象
lock = threading.Lock()
def thread_function():
# 获取锁
lock.acquire()
try:
# 临界区代码
print("Thread is running")
finally:
# 释放锁
lock.release()
# 创建多个线程
threads = []
for i in range(5):
t = threading.Thread(target=thread_function)
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()本题详细解读
1. 什么是 threading.Lock?
threading.Lock 是 Python 中用于线程同步的一个基本工具。它提供了一个简单的互斥锁机制,确保在同一时刻只有一个线程可以执行临界区代码。
2. 如何使用 threading.Lock?
- 创建锁对象:首先需要创建一个
threading.Lock对象。 - 获取锁:在进入临界区之前,调用
lock.acquire()方法获取锁。如果锁已经被其他线程持有,当前线程将会阻塞,直到锁被释放。 - 释放锁:在临界区代码执行完毕后,调用
lock.release()方法释放锁,以便其他线程可以获取锁并执行临界区代码。
3. 为什么使用 try-finally 块?
在获取锁后,使用 try-finally 块可以确保即使临界区代码抛出异常,锁也会被正确释放,避免死锁的发生。
4. 示例代码解析
- 创建锁对象:
lock = threading.Lock()创建了一个锁对象。 - 线程函数:
thread_function是一个线程函数,其中包含临界区代码。在进入临界区之前,线程会尝试获取锁,执行完临界区代码后释放锁。 - 创建并启动线程:通过循环创建了 5 个线程,并启动它们。
- 等待线程完成:使用
join()方法等待所有线程执行完毕。
5. 注意事项
- 死锁:如果锁没有被正确释放,可能会导致死锁。因此,确保在
finally块中释放锁是非常重要的。 - 性能:锁的使用会引入一定的性能开销,因此在设计多线程程序时,应尽量减少锁的争用。