1、互斥锁
为解决资源抢夺问题,使用mutex = Threading.Lock()创建锁,使用mutex.acquire()锁定,使用mutex.release()释放锁。
代码一:
import threading
import time# 定义一个全局变量
g_num = 0def test1(num):global g_num# 上锁,如果之前没有被上锁,那么此时 上锁成功# 如果上锁之前 已经被上锁了,那么此时会堵塞在这里,直到 这个锁被解开位置mutex.acquire()for i in range(num):g_num += 1# 解锁mutex.release()print("-----in test1 g_num=%d----" % g_num)def test2(num):global g_nummutex.acquire()for i in range(num):g_num += 1mutex.release()print("-----in test2 g_num=%d=----" % g_num)# 创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock()def main():t1 = threading.Thread(target=test1, args=(1000000,))t2 = threading.Thread(target=test2, args=(1000000,))t1.start()t2.start()# 等待上面的2个线程执行完毕....time.sleep(2)print("-----in main Thread g_num = %d---" % g_num)if __name__ == "__main__":main()
运行结果:
-----in test1 g_num=1000000----
-----in test2 g_num=2000000=----
-----in main Thread g_num = 2000000---
代码二:(注意,更改了上锁的位置)
import threading
import time# 定义一个全局变量
g_num = 0def test1(num):global g_numfor i in range(num):mutex.acquire() # 上锁g_num += 1mutex.release() # 解锁print("-----in test1 g_num=%d----" % g_num)def test2(num):global g_numfor i in range(num):mutex.acquire() # 上锁g_num += 1mutex.release() # 解锁print("-----in test2 g_num=%d=----" % g_num)# 创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock()def main():t1 = threading.Thread(target=test1, args=(1000000,))t2 = threading.Thread(target=test2, args=(1000000,))t1.start()t2.start()# 等待上面的2个线程执行完毕....time.sleep(2)print("-----in main Thread g_num = %d---" % g_num)if __name__ == "__main__":main()
运行结果:
-----in test1 g_num=1920966----
-----in test2 g_num=2000000=----
-----in main Thread g_num = 2000000---
锁的位置不一样,导致两个线程在运行中进度不一样(线程一在执行到1920966时,就已经释放锁,并输出次数,并由线程二接力),但是两个程序总的线程数仍然一样。