一、数据共享
多个线程内部有自己的数据栈,数据不共享;全局变量在多个线程之间是共享的。
1 # 线程数据共享不安全加锁
2
3 import time
4 from threading import Thread, Lock
5
6
7 num = 100
8
9 def func(t_lock):
10 global num
11 t_lock.acquire()
12 mid = num
13 mid -= 1
14 time.sleep(0.01) # 设置一个时间,模拟数据修改时,先从内存中拿出作修改,在把结果放回去的时间差
15 num = mid
16 t_lock.release()
17
18 if __name__ == '__main__':
19
20 t_lock = Lock()
21
22 t_lst = []
23 for i in range(10):
24 t_thread = Thread(target=func, args=(t_lock,))
25 t_lst.append(t_thread)
26 t_thread.start()
27 [t_obj.join() for t_obj in t_lst] #必须加join,因为主线程和子线程不一定谁快,一般都是主线程快一些,所有我们要等子线程执行完毕才能看出效果
28
29 print('主线程结束!', num) # 结果为90
二、同步锁(互斥锁) - 产生死锁
进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额,进程的死锁和线程的是一样的,而且一般情况下进程之间是数据不共享的,不需要加锁,由于线程是对全局的数据共享的,所以对于全局的数据进行操作的时候,要加锁。
死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁
1 from threading import Thread,Lock
2 import time
3
4 class MyThread(Thread):
5 def run(self):
6 self.func1()
7 self.func2()
8 def func1(self):
9 mutexA.acquire()
10 print('