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

总结:

  1. 互斥锁使用原则:加锁的代码越少越好,对比之下,优先考虑用情况二
  2. 在情况二中,test2执行后的结果是随机的,数值大于一百万,小于两百万,为什么?因为,执行加1代码时,两线程共同抢CPU资源,谁抢到谁用。在test2执行一百万次中,test1也抢到很多,故而,全局变量g_num变成了在test2执行完的时间内两个线程共同作用的结果
上一篇下一篇

猜你喜欢

热点阅读