You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:25:16