zoukankan      html  css  js  c++  java
  • 多任务-python实现-同步概念,互斥锁解决资源竞争(2.1.4)

    @

    1.同步的概念

    同步就是协同步调,按照预定的先后次序进行运行,如你说完我在说
    同步在子面上容易理解为一起工作
    其实不是,同指的应该是协同,协助,互相合作
    如进程,线程同步,可以理解为进程或者线程A,B一块配合
    A运行到某一个的阶段依靠B的某一个结果
    所以A停下来,让B运行
    B执行得到的结果给A,让A在继续操作

    2.解决线程同时修改全局变量的方式

    使用线程同步思路

    线程a调取全局变量的时候,给变量加一把锁
    当a执行完然后再释放锁
    在上锁的过程中不允许其他的线程访问,就保证了数据的正确性

    3.互斥锁

    当多个线程同时修改某一个共享数据的时候,需要进行同步控制

    最简单的同步机制就是互斥锁
    互斥锁为资源引入一个状态:锁定/非锁定
    互斥锁保证了多线程情况下数据的正确性

    代码实现

    import threading
    
    g_num = 0
    
    def test1(num):
        global g_num
        #上锁,如果之前没有被上锁,那么此时上锁成功
        #如果上锁之前 已经被上锁了,那么此时会被堵塞到这里,直到 这个锁被解开为止
        mutex.acquire()
        for i in range(num):
         g_num += 1
        #解锁
        mutex.release()
        print("in test1 gnum = %d" % g_num)
    
    def test2(num):
        global g_num
        mutex.acquire()
        for i in range(num):
            g_num += 1
        mutex.release()
    
        print("in test2 gnum = %d" % g_num)
    
    #创建一个互斥锁,默认是没有上锁的
    mutex = threading.Lock()
    
    def main():
    
        t1 = threading.Thread(target=test1,args=(100000000,))
        t2 = threading.Thread(target=test2,args=(100000000,))
    
        t1.start()
        t2.start()
    
    if __name__ == '__main__':
        main()
    
    
    

    注意

    • 这里在for循环的外面给进程加了锁,循环完毕再给解锁,输出结果是先输出1亿,在输出2亿,毋庸置疑结果正确
    • 把加锁和解锁放在for循环里面,会出现第一个结果和第二个结果几乎同时出现,但是最后的结果是正确的,原因是在执行test1循环的时候计算完然后被test2抢去了,大事计算过程没有被打断,所以结果没有被影响
  • 相关阅读:
    响应式Web设计- 背景图片
    55、装饰器的写法以及应用场景。
    54、用尽量多的方法实现单例模式
    53、 什么是反射?以及应用场景?
    52、列举面向对象中的特殊成员以及应用场景
    51、静态方法和类方法区别?
    算法----练习题2
    50、如何判断是函数还是方法?
    49、是否使用过functools中的函数?其作用是什么?
    48、面向对象中super的作用?
  • 原文地址:https://www.cnblogs.com/simon-idea/p/11318352.html
Copyright © 2011-2022 走看看