多任务-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抢去了,大事计算过程没有被打断,所以结果没有被影响

猜你喜欢

转载自www.cnblogs.com/simon-idea/p/11318352.html