简介
多线程同时操作时可能存在问题:
对于全局变量同时进行操作,导致结果紊乱
互斥锁
1. 为什么要用互斥锁
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁
2. 互斥锁的作用
互斥锁为资源引入一个状态:锁定/非锁定
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”
,其他线程不能更改;知道该线程释放资源,将资源的状态变为“非锁定”
,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
方法
import threading
# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 释放
mutex.release()
案例
g_num = 0
mutex = threading.Lock()
def work1():
global g_num
mutex.acquire() # 先锁定第一块内容
for i in range(50000000):
g_num += 1
print("在task1中,g_num=%d" % g_num)
mutex.release() # g_num = 50000000时释放内容
def work2():
global g_num
mutex.acquire() # 锁定第二块内容, 在第一块内容未完成之前,无法启动
for i in range(50000000):
g_num += 1
print("在task2中,g_num=%d" % g_num)
mutex.release() # g_num = 100000000时释放内容
t1 = threading.Thread(target=work1)
t2 = threading.Thread(target=work2)
t1.start()
t2.start()
t1.join()
t2.join()