Python中如何为两个简单线程实现线程锁?代码调试求助
问题分析与解决
你的代码里锁本身是生效的,但锁的使用方式错了,导致看起来像没成功。
核心问题:你把time.sleep(1)放在了acquire()和release()之间。线程拿到锁后会一直持有锁直到sleep结束才释放,这意味着另一个线程在这1秒里根本抢不到锁,只能等着。最终效果就是两个线程完全串行,一个执行完1秒后另一个才开始,完全体现不出多线程并发的意义。
锁的正确用法是:只在操作共享资源的临界区代码中持有锁,无关操作(比如sleep)应该放在锁外面,这样锁的持有时间最短,能让多个线程真正交替执行。
另外,建议用try-finally包裹临界区,确保即使临界区抛出异常,锁也能被正常释放,避免出现死锁。
修改后的代码如下:
import threading import time thread_lock = threading.Lock() ctr = 0 def thread_1(): while True: global ctr thread_lock.acquire() try: # 临界区:操作共享变量ctr和打印相关内容 ctr += 1 print(ctr, 'thread_1 has added 1 to ctr') finally: # 无论是否异常,都释放锁 thread_lock.release() # sleep放在锁外面,释放锁后再休眠,让另一个线程有机会获取锁 time.sleep(1) def thread_2(): while True: global ctr thread_lock.acquire() try: ctr += 1 print(ctr, 'thread_2 has added 1 to ctr') finally: thread_lock.release() time.sleep(1) t_1 = threading.Thread(target=thread_1) t_2 = threading.Thread(target=thread_2) t_1.start() t_2.start() # 取消注释join,让主线程等待子线程结束(否则主线程会先退出,但子线程仍会运行) t_1.join() t_2.join()
运行修改后的代码,你会看到两个线程交替打印,ctr会依次递增,这才是锁正确保护共享资源的效果。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

