zoukankan      html  css  js  c++  java
  • 多线程互斥锁

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

    没有上锁的时候

     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

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/yifengs/p/11382808.html
Copyright © 2011-2022 走看看