• 多线程互斥锁


    因为多线程运行时要争夺资源,导致同事写入全局变量的时候回出现问题 所以用互斥锁可以解决这个问题

    没有上锁的时候

     1 import threading
     2 import time
     3 
     4 
     5 # 定义一个全局变量
     6 g_num = 0
     7 
     8 
     9 def test1(num):
    10     global g_num
    11     for i in range(num):
    12         g_num += 1
    13     print("------in test1 g_num=%d----" % g_num)
    14 
    15 def test2(num):
    16     global g_num
    17     for i in range(num):
    18         g_num += 1
    19     print("------in test1 g_num=%d----" % g_num)
    20 
    21 
    22 def main():
    23     t1 = threading.Thread(target=test1,args=(1000000,))
    24     t2 = threading.Thread(target=test2,args=(1000000,))
    25 
    26     t1.start()
    27     t2.start()
    28 
    29     time.sleep(2)
    30 
    31     print("----in main g_num=%d-----" % g_num)

    结果:

    ------in test1 g_num=1305261----
    ------in test1 g_num=1285875----
    ----in main g_num=1285875-----
    

      

    如果按照预想的,结果应该是:2000000

    出现原因--资源争夺

    上锁后的情况

     1 import threading
     2 import time
     3 
     4 
     5 # 定义一个全局变量
     6 g_num = 0
     7 
     8 
     9 def test1(num):
    10     global g_num
    11     # 上锁,如果之前没被上锁,那么此时上锁成功
    12     # 如果上锁之前已经被上锁,那么此时会堵塞在这里,知道这个所被解开为止
    13     mutex.acquire()
    14     for i in range(num):
    15         g_num += 1
    16     # 解锁
    17     mutex.release()
    18     print("------in test1 g_num=%d----" % g_num)
    19 
    20 def test2(num):
    21     global g_num
    22     mutex.acquire()
    23     for i in range(num):
    24         g_num += 1
    25     mutex.release()
    26     print("------in test1 g_num=%d----" % g_num)
    27 
    28 
    29 # 创建一个互斥锁 默认是打开状态
    30 mutex = threading.Lock()
    31 
    32 
    33 def main():
    34     t1 = threading.Thread(target=test1,args=(1000000,))
    35     t2 = threading.Thread(target=test2,args=(1000000,))
    36 
    37     t1.start()
    38     t2.start()
    39 
    40     # 等待两个线程执行完毕
    41     time.sleep(2)
    42 
    43     print("----in main g_num=%d-----" % g_num)

    结果

    ------in test1 g_num=1000000----
    ------in test1 g_num=2000000----
    ----in main g_num=2000000-----
    

      

    test1抢先上锁,运行完毕后会解锁,然后test2接着上锁,得出结果:2000000

  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/yifengs/p/11382808.html
Copyright © 2020-2023  润新知