python:threadingマルチスレッドモジュール-ロックの概要

3324 ワード

共通データx(共有リソース、臨界リソースとも呼ばれる)を持ち、10スレッドを走ってこの変数にアクセスし、この変数を修正する操作を行うと、予想外の結果が得られる.
ps:以下のコードは「python-言語を征服して典型的な応用に基づいている」から来ている.
import threading                            #   threading  
import time                             #   time  
class mythread(threading.Thread):        #        
    def __init__(self,threadname):      #      
        #           
        threading.Thread.__init__(self,name = threadname)  
    def run(self):                          #   run  
        global x                  #   global  x     
        for i in range(3):
            x = x + 1
        time.sleep(2)          #   sleep  ,     5 
        print x
                                                            
tl = []                              #     
for i in range(10):
    t = mythread(str(i))               #     
    tl.append(t)                      #           
                                                        
x=0                                 #  x   0
for i in tl:
    i.start()                           #       
                                                        
#######    ######
[root@localhost ~]# python syn.py
30
30
30
30
30
30
30
30
30
30

xはグローバル変数(共有リソース)であるため,各スレッドがxに対して操作すると休眠する.
スレッドがスリープしている間に他のスレッドも操作を開始し、
最終スリープ5秒後にxの値が最終的に30に変更されました
反発ロックを使用して、公共リソースを保護します.反発ロックを使用して、同じ時点で1つのスレッドだけが共通リソースにアクセスすることを保証し、簡単な同期を実現します.
反発ロック:threading.Lock  
反発ロック方法:acquire()ロックrelease()を取得する:ロックを解除する
1つのスレッドがロックを取得すると、このロックはlocke状態に入り(ロックされている)、別のスレッドがロックを取得しようとすると同期ブロック状態になります.
スレッドロックを持つスレッドがロックメソッドrelease()を呼び出すとロックが解放され、ロックはオープンロックunlocked状態になり、同期ブロック状態のスレッドから1つ選択してロックが得られる
import threading                            #   threading  
import time                             #   time  
class mythread(threading.Thread):                   #        
    def __init__(self,threadname):                  #      
        threading.Thread.__init__(self,name = threadname)  
    def run(self):                          #   run  
        global x                        #   global  x     
        lock.acquire()                      #   lock acquire  
        for i in range(3):
            x = x + 1
        time.sleep(2)           #   sleep  ,     5 
        print x
        lock.release()                #   lock release  
lock = threading.Lock()               #      
tl = []                          #     
for i in range(10):
    t = mythread(str(i))            #     
    tl.append(t)              #           
                          
x=0                        #  x   0
for i in tl:
    i.start()                     #       
                          
######    ######
[root@localhost ~]# python syn.py
3
6
9
12
15
18
21
24
27
30

再読み込み可能ロック:threading.RLock()
方法は反発ロックと同じです.
ロックがネストされている場合、スレッドがあり、ロックと共有リソースが取得されますが、別のリソースを取得するためにロックが必要です.コードの中の
lock = threading.Lock()

次のように変更します.
lock = threading.RLock()