zoukankan      html  css  js  c++  java
  • 线程锁Lock

    from threading import Thread, Lock
    import time
    
    
    def func():
        global n
        n -= 1
    
    
    n = 10
    t_list = []
    for i in range(10):
        t = Thread(target=func,)
        t_list.append(t)
        t.start()
    for t in t_list:
        t.join()
    print(n)

    这段代码结果我们知道,因为GIL的原因,结果是0

    再看如下代码:

    from threading import Thread, Lock
    import time
    
    
    def func():
        global n
        temp = n
        time.sleep(0.1)
        n = temp - 1
    
    
    n = 10
    t_list = []
    for i in range(10):
        t = Thread(target=func,)
        t_list.append(t)
        t.start()
    for t in t_list:
        t.join()
    print(n)

    打印结果却是9

    为什么呢?

    因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就导致数据的不安全了。

    怎么改进?加锁就可以了

    from threading import Thread, Lock
    import time
    
    
    def func(lock):
        lock.acquire()
        global n
        temp = n
        time.sleep(0.1)
        n = temp - 1
        lock.release()
    
    
    lock =Lock()
    n = 10
    t_list = []
    for i in range(10):
        t = Thread(target=func, args=(lock,))
        t_list.append(t)
        t.start()
    for t in t_list:
        t.join()
    print(n)

    这样打印的结果就是0了。

  • 相关阅读:
    c# 自定义位数生成激活码
    接口interface和抽象类型abstract
    winform自动升级方案
    泛型介绍
    泛型约束形式
    登录状态保持Session/Cookie
    EFCore 2.0引用标量函数
    .net生成条形码
    通用手机号、身份证号等隐藏显示方法
    .net core api Post请求
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9851743.html
Copyright © 2011-2022 走看看