Python多线程如何使用互斥锁
1、打开Ubuntu虚拟机,登录系统后,在桌面空白处右键 -- 打开终端。

2、在终端使用vi编辑器创建一个文件tetr.py,在文件写内容如下:
from threading import Thread
import time
num = 0
def test1():
global num
for i in range(1000000):
num += 1
print("---test1---num=%d"%num)
def test2():
global num
for i in range(1000000):
num += 1
print("---test2---num=%d"%num)
p1 = Thread(target=test1)
p1.start()
time.sleep(4)
p2 = Thread(target=test2)
p2.start()
print("---num=%d---"%num)
代码中创建了一个全局变量num,在两个线程中分别对num累加了100000次1,在第一个线程创建创建,延迟了4秒创建第二个线程。

3、在终端运行代码:
python3 tetr.py
结果如下下图所示,第一个线程执行完累加后全局变量变为100000,第二个线程执行完累加后全局变量变为200000和预期一致。

4、修改第二步代码,去掉第一个线程之后的sleep,代码如下:
from threading import Thread
import time
num = 0
def test1():
global num
for i in range(1000000):
num += 1
print("---test1---num=%d"%num)
def test2():
global num
for i in range(1000000):
num += 1
print("---test2---num=%d"%num)
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print("---num=%d---"%num)

5、在终端运行代码,如下图所示
python3 tetr.py
发现并没有全局变量累加后并没有达到预期的200000,这是因为多线程导致的混乱。

6、为解决多线程使用全局变量的问题,引入互斥锁,修改代码如下:
from threading import Thread,Lock
import time
num = 0
def test1():
global num
mutex.acquire()
for i in range(1000000):
num += 1
mutex.release()
print("---test1---num=%d"%num)
def test2():
global num
mutex.acquire()
for i in range(1000000):
num += 1
mutex.release()
print("---test2---num=%d"%num)
mutex = Lock()
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print("---num=%d---"%num)
简单来说互斥锁,就是先要引入Lock,然后在主线程实例化锁对象,最后在子线程操作全局变量时候上锁,操作完成后解锁。

7、在终端运行代码,可以成功看到预期的结果了,互斥锁使用效果很好。
