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

首先,来看这一段代码

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 @ 2024-08-28 01:00  无悔的选择  阅读(31)  评论(0)    收藏  举报