内存混乱及解决方法和死锁问题

首先,来看这一段代码

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()会阻塞,因为锁已经被占用了。这样程序就会一直运行下去,无法继续执行

posted @   无悔的选择  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示