数据枷锁安全

"""
线程共享资源也就是说共享全局资源,线程又是并发运行,因此当多个线程对同一个内存进行更改(写)操作时,会发生混乱
    num = 0
    线程1 获取num =0
    线程2 获取num =0

    线程1 num+=1   num = 1
    线程1 num+=1   num = 2
    线程1 num+=1   num = 3
    线程2 num+=1   num = 1
    即线程2获取的数据并不是3,因此发生家操作后并不是想要的结果

使用锁,每当数据进行更改,对该数据枷锁;执行完功能后,释放锁

锁可以是全局的,这样所有的入口函数都可以使用
多线程同时访问的全局数据才会发生混乱
必须调用 global  才能访问全局变量

"""
import threading
# 声明全局变量
num = 0
# 全局范围内声明一个锁实例
loa = threading.Lock()


def funa():
    """使用同一个锁的第一个入口函数"""
    for i in range(1000000):
        # 引用全局变量
        global num
        # 锁定数据
        loa.acquire()
        # 写(更改)操作
        num += 1
        # 释放资源
        loa.release()


def funb():
    """使用同一个锁的第二个入口函数"""
    for i in range(1000000):
        # 引用全局变量
        global num
        # 锁定数据
        loa.acquire()
        # 写(更改)操作
        num += 1
        # 释放资源
        loa.release()


def main():
    # 新建多个线程
    t1 = threading.Thread(target=funa)
    t2 = threading.Thread(target=funb)

    # 开启线程
    t1.start()
    t2.start()
    # 阻塞主线程,防止子线程随主线程结束
    t1.join()
    t2.join()
    # 测试全局变量
    print(num)


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值