内存混乱及解决方法和死锁问题
首先,来看这一段代码
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()会阻塞,因为锁已经被占用了。这样程序就会一直运行下去,无法继续执行

浙公网安备 33010602011771号