zoukankan      html  css  js  c++  java
  • 同步锁2 互斥锁

     1 import threading
     2 import time
     3 
     4 num = 100
     5 def add():
     6     global num
     7     s = num
     8     time.sleep(0.02)
     9     num = s - 1
    10 
    11 l = list()
    12 for i in range(100):
    13     t = threading.Thread(target=add)
    14     l.append(t)
    15     t.start()
    16 for i in l:
    17     i.join()
    18 print(num)
    19 输出:
    20 99
    21 
    22 进程完成,退出码 0

    遇到了IO阻塞,进行了切换。   

    单个线程中间发生了切换。任务只处理了一半。    需要拿出一个解决的办法将正在执行的线程处理完,在进行下一个线程。

    可以进行加上同步锁lock = threading.Lock(),使其变成不阻塞

     1 import threading
     2 import time
     3 
     4 num = 100
     5 lock = threading.Lock()
     6 def add():
     7     lock.acquire()
     8     global num
     9     s = num
    10     time.sleep(0.02)
    11     num = s - 1
    12     lock.release()
    13 
    14 l = list()
    15 for i in range(100):
    16     t = threading.Thread(target=add)
    17     l.append(t)
    18     t.start()
    19 for i in l:
    20     i.join()
    21 print(num)
    22 输出:
    23 0
    24 
    25 进程完成,退出码 0

    加上锁之后就变成串行。

    但是串行的就只有加锁的这三行,所以加锁还是有意义的。其它的代码照常同时是并行的执行。

      1 import threading
      2 import time
      3 
      4 num = 100
      5 lock = threading.Lock()
      6 def add():
      7 
      8     global num
      9     print(num)
     10     lock.acquire()
     11 
     12     s = num
     13 
     14     time.sleep(0.02)
     15     num = s - 1
     16     lock.release()
     17 
     18 l = list()
     19 for i in range(100):
     20     t = threading.Thread(target=add)
     21     l.append(t)
     22     t.start()
     23 for i in l:
     24     i.join()
     25 print(num)
     26 输出:
     27 100
     28 100
     29 100
     30 100
     31 100
     32 100
     33 100
     34 100
     35 100
     36 100
     37 100
     38 100
     39 100
     40 100
     41 100
     42 100
     43 100
     44 100
     45 100
     46 100
     47 100
     48 100
     49 100
     50 100
     51 100
     52 100
     53 100
     54 100
     55 100
     56 100
     57 100
     58 100
     59 100
     60 100
     61 100
     62 100
     63 100
     64 100
     65 100
     66 100
     67 100
     68 100
     69 100
     70 100
     71 100
     72 100
     73 100
     74 100
     75 100
     76 100
     77 100
     78 100
     79 100
     80 100
     81 100
     82 100
     83 100
     84 100
     85 100
     86 100
     87 100
     88 100
     89 100
     90 100
     91 100
     92 100
     93 100
     94 100
     95 100
     96 100
     97 100
     98 100
     99 100
    100 100
    101 100
    102 100
    103 100
    104 100
    105 100
    106 100
    107 100
    108 100
    109 100
    110 100
    111 100
    112 100
    113 100
    114 100
    115 100
    116 100
    117 100
    118 100
    119 100
    120 100
    121 100
    122 100
    123 100
    124 100
    125 100
    126 100
    127 0

    这就是处理办法

  • 相关阅读:
    myeclipse tomcat启动,内存溢出问题
    SQL Server 中的模糊查询 LIKE
    GridView学习
    自己手动创建dataset的方法(不用从数据库倒入)
    关于在updatepanel中response失效的解决方法
    CSS中背景图片定位方法
    Visual Studio 2005中调试SQL Server 2005的存储过程
    第二个dropdownlist不能触发selectchange的问题
    C/C++ 控制台窗口暂停
    蛇形矩阵
  • 原文地址:https://www.cnblogs.com/ch2020/p/12688828.html
Copyright © 2011-2022 走看看