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