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抢去了,大事计算过程没有被打断,所以结果没有被影响
  • 相关阅读:
    子信息传递多个参数
    Oracle q' 简化单引号转义
    HTML的target属性中_blank、_self、_parent、_top含义
    数据库设计之“有时不得不违背的第三范式”
    Jquery下的Ajax调试方法
    JQuery.Ajax之错误调试帮助信息
    定时删除数据-用JOB
    数据分析
    机器学习数学基础
    机器学习数学基础
  • 原文地址:https://www.cnblogs.com/simon-idea/p/11318352.html
Copyright © 2011-2022 走看看