【背景】
模拟卖票程序,50个窗口同时卖5000张票
从中可以观察5000张票的临界资源怎么被争夺
from threading import Thread,Lock
import time
num=5000
#卖票程序
def sale(i):
global num
while num>0:
#mylock.acquire()
num-=1
print('num='+str(num),i)
# mylock.release()
t=[]
#mylock=Lock()
for i in range(50):
#创建线程
t1=Thread(target=sale,args=(i,))
t.append(t1)
for thread in t:
#多线程启动
thread.start()
【运行结果】
运行结果很奇怪,并没有出现一票多卖的情况
多个线程写同一变量不会出现问题吗?
那为什么还要上锁?
这让我对之前学到的线程同步互斥机制产生怀疑
【修改程序】
考虑到num-=1可能是一个原子操作(猜测),或者根本就是因为程序运行的太快了,增加时延:
每次num-=1之后,延时0.01秒,即time.sleep(0.01)
这次出现了一票多卖的情况!我的理解是sleep()函数会让当前线程被挂起,这就给了其他线程重复写的机会。
但是注意:
时延一定要放在num-=1之后,原因也可以推测,只有在修改了num值之后再时延才会出现写未发生的机制,否则一台PC不能模拟出多台终端同时访问的情况
【防止重复写】
Python程序上锁
while num>0:
mylock.acquire()
num-=1
time.sleep(0.001)
print('num='+str(num),i)
mylock.release()
mylock=Lock()
在外面的主线程上创建一个锁对象,这次,我们即使有了sleep也可以成功访问
探索完成