使用互斥锁解决线程资源竞争:
什么是线程?
可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等,线程是操作系统调度执行的最小单位.
线程的创建步骤:
import threading
# 创建一个线程对象
t1 = threading.Thread(target=func_name, args=(num,), name=”子线程名字”)
# 创建一个线程并启动
t1.start()
# 等待子线程执行完毕之后再继续向下执行主线程
t1.join()
注:主线程会等待子线程结束之后才会结束,主线程一死,子线程也会死。线程的调度是随机的,并没有先后顺序。
死锁的概念:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,尽管死锁很少发生,但一旦发生就会造成应用的停止响应。
互斥锁的运用:由于多线程之间共享全局变量就会导致出现资源竞争的问题,为了避免这种竞争出现,利用互斥锁可以实现线程同步。
# 创建锁
Mutex = threading.Lock()
# 加锁
Mutex.acquire()
# 释放锁
Mutex.release()
使用互斥锁解决线程资源竞争案例分析:
import threading
import time
g_num = 100
def work1(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += 1
mutex.release()
print("work1 g_num is:%d" % g_num)
def work2(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += 1
mutex.release()
print("work2 g_num is:%d" % g_num)
# 创建一个锁
mutex = threading.Lock()
def main():
t1 = threading.Thread(target=work1, args=(1000000,))
t2 = threading.Thread(target=work2, args=(1000000,))
t1.start()
t2.start()
# 等上面两个线程结束
time.sleep(3)
print("main g_num is: %d" % g_num)
if __name__ == '__main__':
main()
运行结果: