【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
posted @ 2024-01-23 14:27  Chimengmeng  阅读(7)  评论(0编辑  收藏  举报
/* */