# coding = utf-8
from threading import Thread, Lock
"""
线程不共享局部变量,共享全局变量,线程不安全。引入互斥锁解决此问题,确保了某段关键代码只能由一个线程从头到尾完整地执行。
互斥锁带来的问题:1、阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。2、由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
mutex = Lock() # 创建锁
mutex.acquire([blocking]) # 锁定 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)如果设定blocking为False,则当前线程不会堵塞
mutex.release() # 释放
"""
mutex = Lock() # 创建一个互斥锁 默认是未上锁的状态
g_num = 0
def test1():
global g_num
for i in range(500000):
mutex_flag = mutex.acquire(True)
if mutex_flag:
g_num += 1
mutex.release()
print("---test1---g_num=%d" % g_num)
def test2():
global g_num
for i in range(500000):
mutex_flag = mutex.acquire(True) # True表示堵塞
if mutex_flag:
g_num += 1
mutex.release()
print("---test2---g_num=%d" % g_num)
def main():
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print("---g_num=%d---" % g_num)
if __name__ == '__main__':
main()
运行结果:
—g_num=35421—
—test1—g_num=949177
—test2—g_num=1000000