内存混乱及解决方法和死锁问题
首先,来看这一段代码
import threading
i=0
def sum1():
global i
for x in range(100000000):
i+=x
i-=x
print('sum1',i)
def sum2():
global i
for x in range(100000000):
i+=x
i-=x
print('sum2',i)
thr1=threading.Thread(target=sum1)
thr2=threading.Thread(target=sum2)
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print(i)
会输出什么?
答案是不确定,因为线程sum1和线程sum2都在对全局变量i进行操作,会竞争i,导致i值不确定,因此,输出结果是不确定的。那么怎么解决这个问题?
import threading
lock=threading.Lock()
i=0
def sum1():
global i
#上锁
if lock.acquire():
for x in range(100000000):
i+=x
i-=x
lock.release()
print('sum1',i)
def sum2():
global i
if lock.acquire():
for x in range(100000000):
i+=x
i-=x
lock.release()
print('sum2',i)
thr1=threading.Thread(target=sum1)
thr2=threading.Thread(target=sum2)
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print(i)
在这段代码中,使用了锁来保护对i的访问,这样,每个线程在操作i时都会先获取锁,操作完成后释放锁。这样可以确保i的值在多线程环境下是确定的
什么是死锁问题?
举例:
locl=threading.Lock()
lock.acquire()
lock.acquire()
lock.release()
这段代码会导致死锁,因为第一个lock.acquire()获取了锁,第二个lock.acquire()会阻塞,因为锁已经被占用了。这样程序就会一直运行下去,无法继续执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!