国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python多線程編程(六):可重入鎖RLock

2019-11-25 17:50:12
字體:
來源:轉載
供稿:網友

考慮這種情況:如果一個線程遇到鎖嵌套的情況該怎么辦,這個嵌套是指當我一個線程在獲取臨界資源時,又需要再次獲取。

根據這種情況,代碼如下:

復制代碼 代碼如下:

'''
Created on 2012-9-8
 
@author: walfred
@module: thread.ThreadTest6
''' 
 
import threading 
import time 
 
counter = 0 
mutex = threading.Lock() 
 
class MyThread(threading.Thread): 
    def __init__(self): 
        threading.Thread.__init__(self) 
 
    def run(self): 
        global counter, mutex 
        time.sleep(1); 
        if mutex.acquire(): 
            counter += 1 
            print "I am %s, set counter:%s" % (self.name, counter) 
            if mutex.acquire(): 
                counter += 1 
                print "I am %s, set counter:%s" % (self.name, counter) 
                mutex.release() 
            mutex.release() 
 
if __name__ == "__main__": 
    for i in range(0, 200): 
        my_thread = MyThread() 
        my_thread.start()

這種情況的代碼運行情況如下:

復制代碼 代碼如下:

I am Thread-1, set counter:1

之后就直接掛起了,這種情況形成了最簡單的死鎖。

那有沒有一種情況可以在某一個線程使用互斥鎖訪問某一個競爭資源時,可以再次獲取呢?在Python中為了支持在同一線程中多次請求同一資源,python提供了“可重入鎖”:threading.RLock。這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖:

代碼只需將上述的:

復制代碼 代碼如下:

mutex = threading.Lock()

替換成:
復制代碼 代碼如下:

mutex = threading.RLock()

即可。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚松县| 大悟县| 闸北区| 宜都市| 墨竹工卡县| 陆丰市| 徐州市| 天峻县| 建宁县| 加查县| 离岛区| 惠水县| 兰州市| 陇西县| 罗城| 海盐县| 天等县| 芜湖市| 垣曲县| 合水县| 文水县| 佛学| 青岛市| 军事| 正宁县| 大洼县| 林西县| 枣庄市| 阳山县| 陵水| 施秉县| 白河县| 涿鹿县| 治多县| 高阳县| 邯郸市| 稷山县| 绩溪县| 浠水县| 仁怀市| 玛多县|