在 Python 中,可以使用锁(Lock)和条件变量(Condition)来确保代码片段是线程安全的。以下是一个示例,展示了如何使用它们来保护共享资源的访问:
import threading
import time
# 共享资源
resource = 0
# 锁
lock = threading.Lock()
# 条件变量
condition = threading.Condition(lock)
# 等待条件的函数
def wait_for_condition():
with condition:
while resource < 5:
condition.wait()
print("等待条件满足:资源达到 5")
# 当条件满足时,进行其他操作...
# 改变条件的函数
def change_condition():
with condition:
resource += 1
if resource == 5:
condition.notify_all()
print("改变条件:资源增加到", resource)
# 创建线程
thread1 = threading.Thread(target=wait_for_condition)
thread2 = threading.Thread(target=change_condition)
# 启动线程
thread1.start()
thread2.start()
# 等待线程完成
thread1.join()
thread2.join()
在上述示例中,我们有一个共享资源 resource
,并使用锁 lock
和条件变量 condition
来保护对它的访问。
wait_for_condition
函数表示等待某个条件满足的线程。它在循环中检查条件,当条件不满足时,通过调用 condition.wait
使线程阻塞。当条件满足时,线程被唤醒并继续执行后续操作。
change_condition
函数表示改变条件的线程。它在改变共享资源的同时,根据需要使用 condition.notify_all
来通知等待的线程条件已经满足。
通过正确地使用锁和条件变量,我们可以确保在多线程环境下,对共享资源的访问是线程安全的,避免了竞态条件和数据不一致的问题。
请注意,这只是一个简单的示例,实际应用中可能需要更复杂的逻辑和更细致的线程同步策略。此外,还要注意避免死锁等问题的发生。在处理多线程时,始终要谨慎处理共享资源的访问,并确保线程之间的协作和通信正确无误。