zoukankan      html  css  js  c++  java
  • 线程数据不安全现象

    线程数据不安全现象

    from threading import Thread
    n = 0
    def add():
        for i in range(500000):
            global n
            n += 1
    def sub():
        for i in range(500000):
            global n
            n -= 1
    
    t_l = []
    for i in range(2):
        t1 = Thread(target=add)
        t1.start()
        t2 = Thread(target=sub)
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    #结果n不为0
    
    from threading import Thread
    import time
    n = []
    def append():
        for i in range(500000):
            n.append(1)
    def pop():
        for i in range(500000):
            if not n:
                time.sleep(0.0000001)
            n.pop()
    
    t_l = []
    for i in range(20):
        t1 = Thread(target=append)
        t1.start()
        t2 = Thread(target=pop)
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    #使用append pop方法数据安全
    
    += -=  *= /= while if 数据不安全   + 和 赋值是分开的两个操作
    append pop strip数据安全 列表中的方法或者字典中的方法去操作全局变量的时候 数据安全的
    线程之间也存在数据不安全
    

    线程锁

    from threading import Thread,Lock
    n = 0
    def add(lock):
        for i in range(500000):
            global n
            with lock:
                n += 1
    def sub(lock):
        for i in range(500000):
            global n
            with lock:
                n -= 1
    
    t_l = []
    lock = Lock()
    for i in range(2):
        t1 = Thread(target=add,args=(lock,))
        t1.start()
        t2 = Thread(target=sub,args=(lock,))
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    
    from threading import Thread,Lock
    import time
    n = []
    def append():
        for i in range(500000):
            n.append(1)
    def pop(lock):
        for i in range(500000):
            with lock:
                if not n:
                    time.sleep(0.0000001)    # 强制CPU轮转
                n.pop()
    
    t_l = []
    lock = Lock()
    for i in range(20):
        t1 = Thread(target=append)
        t1.start()
        t2 = Thread(target=pop,args=(lock,))
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    
    不要操作全局变量,不要在类里操作静态变量
    += -= *= /= if while 数据不安全
    queue logging 数据安全的
    

    单例模式

    import time
    class A:
        from threading import Lock
        __instance = None
        lock = Lock()
        def __new__(cls, *args, **kwargs):
            with cls.lock:
                if not cls.__instance:
                    time.sleep(0.000001)   # cpu轮转
                    cls.__instance = super().__new__(cls)
            return cls.__instance
    
    def func():
        a = A()
        print(a)
    from threading import Thread
    for i in range(10):
        Thread(target=func).start()
    
  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13379849.html
Copyright © 2011-2022 走看看