作用:
解决资源竞争问题
死锁:
当一组线/进程中的每个线/进程都在等待某个事件发生,而只有这组线/进程中的其他进程才能触发该事件,这就称这组线/进程发生了死锁。
创建的锁过多,可能会造成死锁问题。
可以在设计程序时从逻辑上避免死锁出现,延时、银行家算法等
# 以下代码如未使用互斥锁,最终计算出来的的数值会出错(比实际数小)
# 上锁的代码越少越好,只在关键位置加锁
import threading
import time
# 定义一个全局变量
g_num = 0
# 创建一个互斥锁,默认没有上锁
mutex = threading.Lock()
def func1(num):
global g_num
# 如上锁之前没有上锁,此时上锁成功
# 如上锁之前已被上锁,此时会堵塞在这里,直到锁被解开
for i in range(num):
# 上锁
mutex.acquire()
g_num += 1
# 解锁
mutex.release()
print("in func1 g_num=%d" % g_num)
def func2(num):
global g_num
for i in range(num):
# 上锁
mutex.acquire()
g_num += 1
# 解锁
mutex.release()
print("in func2 g_num=%d" % g_num)
def main():
# target指定将来这个线程去哪个函数执行代码
# args指定将来调用函数的时候,传递什么数据过去
t1 = threading.Thread(target=func1, args=(1000000,))
t2 = threading.Thread(target=func2, args=(1000000,))
t1.start()
t2.start()
# 等待上面2个线程执行完毕..
time.sleep(5)
print("in main Thread g_num=%d" % g_num)
if __name__ == "__main__":
main()