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抢去了,大事计算过程没有被打断,所以结果没有被影响
  • 相关阅读:
    科学家质疑当今商用量子计算机的性能
    科学家研制出可模拟大脑信息处理的微芯片
    2014年电子科技市场衰退
    号外!CentOS 宣布加入红帽公司!
    hadoop,高富帅的玩具?
    成为Linux内核高手的四个方法
    分阶段事件驱动架构【SEDA】
    原型程式设计【原型语言】
    IOS7.1 企业应用 证书无效 已解决
    iOS7.1企业应用"无法安装应用程序 因为证书无效"的解决方案
  • 原文地址:https://www.cnblogs.com/simon-idea/p/11318352.html
Copyright © 2011-2022 走看看