在上一节提到的资源抢占的问题,那么这个问题如何解决呢?互斥锁就可以解决这个问题:
资源抢占的问题原因在于两个线程操作同一个资源,此时这个资源的内容就混乱了,对于两个线程都不能正常服务
此时就可以考虑在一个线程工作的时候,将线程锁定,其他线程无法访问,这就是互斥锁
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
某个线程要更改共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能改变,只到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 解锁
mutex.release()
应用在上一节的代码中:
import threading
import time
num = 100
def main():
mutex = threading.Lock()
t1 = threading.Thread(target=add1,args=(1000000,mutex))
t2 = threading.Thread(target=add2,args=(1000000,mutex))
t1.start()
#time.sleep(1)
t2.start()
t1.join()
t2.join()
print(f'-----main-----{num}')
def add1(nums,mutex):
global num
mutex.acquire()
for i in range(nums):
num+=1
mutex.release()
#time.sleep(1)
print(f'-----add1----{num}')
def add2(nums,mutex):
global num
mutex.acquire()
for i in range(nums):
num += 1
mutex.release()
#time.sleep(1)
print(f'-----add2----{num}')
if __name__ == '__main__':
main()