python——互斥锁的使用和分析
2021-09-28 本文已影响0人
mutang
mutex = threading.Lock()
定义一个全局的互斥锁对象,默认不加锁
情况一:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@author: zx coder
@software: PyCharm
@file: t5全局变量竞争资源.py
@time: 2020/9/27 22:23
"""
import threading
import time
g_num = 0
def test1(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += num
mutex.release()
print("--------in test1 g_num = %d"%g_num)
def test2(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += num
mutex.release()
print("--------in test2 g_num = %d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(2)
print(f"--- main ---- g_num = {g_num}")
mutex = threading.Lock()
if __name__ == '__main__':
main()
out:
--------in test1 g_num = 1000000000000
--------in test2 g_num = 2000000000000
--- main ---- g_num = 2000000000000
再看,情况二:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@author: zx coder
@software: PyCharm
@file: t5全局变量竞争资源.py
@time: 2020/9/27 22:23
"""
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
mutex.acquire()
g_num += num
mutex.release()
print("--------in test1 g_num = %d"%g_num)
def test2(num):
global g_num
for i in range(num):
mutex.acquire()
g_num += num
mutex.release()
print("--------in test2 g_num = %d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(2)
print(f"--- main ---- g_num = {g_num}")
mutex = threading.Lock()
if __name__ == '__main__':
main()
out:
--------in test2 g_num = 1894359000000
--------in test1 g_num = 2000000000000
--- main ---- g_num = 2000000000000
总结:
- 互斥锁使用原则:加锁的代码越少越好,对比之下,优先考虑用情况二
- 在情况二中,test2执行后的结果是随机的,数值大于一百万,小于两百万,为什么?因为,执行加1代码时,两线程共同抢CPU资源,谁抢到谁用。在test2执行一百万次中,test1也抢到很多,故而,全局变量g_num变成了在test2执行完的时间内两个线程共同作用的结果