【6.2】线程的互斥锁
【一】问题
- 所有子线程都会进行阻塞操作,导致最后的改变只是改了一次
from threading import Thread
import time
money = 100
def task():
global money
# 模拟获取到车票信息
temp = money
# 模拟网络延迟
time.sleep(2)
# 模拟购票
money = temp - 1
def main():
t_list = []
for i in range(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
# 所有子线程结束后打印 money
print(money)
if __name__ == '__main__':
main()
# 99
【二】解决办法
- 在数据发生变化的地方进行加锁处理
from threading import Thread, Lock
import time
money = 100
# 生成锁
mutex = Lock()
def task():
global money
# 数据发生改变之前加锁
mutex.acquire()
# 模拟获取到车票信息
temp = money
# 模拟网络延迟
time.sleep(0.6)
# 模拟购票
money = temp - 1
# 数据发生改变后解锁
mutex.release()
def main():
t_list = []
for i in range(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
# 所有子线程结束后打印 money
print(money)
if __name__ == '__main__':
main()
# 0
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17982393