<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 431,  comments - 344,  trackbacks - 0
    多個執行線程經常要共享數據,如果僅僅讀取共享數據還好,但是如果多個線程要修改共享數據的話就可能出現無法預料的結果。

        假如兩個線程對象t1t2都要對數值num=0進行增1運算,那么t1t2都各對num修改10次的話,那么num最終的結果應該為20。但是如果當t1取得num的值時(假如此時num0),系統把t1調度為“sleeping”狀態,而此時t2轉換為“running”狀態,此時t2獲得的num的值也為0,然后他把num+1的值1賦給num。系統又把t2轉化為“sleeping”狀態,t1為“running”狀態,由于t1已經得到num值為0,所以他也把num+1的值賦給了num1。本來是2次增1運行,結果卻是num只增了1次。類似這樣的情況在多線程同時執行的時候是有可能發生的。所以為了防止這類情況的出現就要使用線程同步機制。

        最簡單的同步機制就是“鎖”

        鎖對象用threading.RLock類創建

        mylock = threading.RLock()

        如何使用鎖來同步線程呢?線程可以使用鎖的acquire() (獲得)方法,這樣鎖就進入“locked”狀態。每次只有一個線程可以獲得鎖。如果當另一個線程試圖獲得這個鎖的時候,就會被系統變為“blocked”狀態,直到那個擁有鎖的線程調用鎖的release() (釋放)方法,這樣鎖就會進入“unlocked”狀態。“blocked”狀態的線程就會收到一個通知,并有權利獲得鎖。如果多個線程處于“blocked”狀態,所有線程都會先解除“blocked”狀態,然后系統選擇一個線程來獲得鎖,其他的線程繼續沉默(“blocked”)。

    import threading
    mylock = threading.RLock()
    class mythread(threading.Thread)
        ...
        def run(self ...):
            ...     #此處 不可以 放置修改共享數據的代碼
            mylock.acquire()
            ...     #此處 可以 放置修改共享數據的代碼
            mylock.release()
            ...    
    #此處 不可以 放置修改共享數據的代碼

        我們把修改共享數據的代碼稱為“臨界區”,必須將所有“臨界區”都封閉在同一鎖對象的acquire()release()方法調用之間。

        鎖只能提供最基本的同步級別。有時需要更復雜的線程同步,例如只在發生某些事件時才訪問一個臨界區(例如當某個數值改變時)。這就要使用“條件變量”。

        條件變量用threading.Condition類創建

        mycondition = threading.Condition()

        條件變量是如何工作的呢?首先一個線程成功獲得一個條件變量后,調用此條件變量的wait()方法會導致這個線程釋放這個鎖,并進入“blocked”狀態,直到另一個線程調用同一個條件變量的notify()方法來喚醒那個進入“blocked”狀態的線程。如果調用這個條件變量的notifyAll()方法的話就會喚醒所有的在等待的線程。

        如果程序或者線程永遠處于“blocked”狀態的話,就會發生死鎖。所以如果使用了鎖、條件變量等同步機制的話,一定要注意仔細檢查,防止死鎖情況的發生。對于可能產生異常的臨界區要使用異常處理機制中的finally子句來保證釋放鎖。等待一個條件變量的線程必須用notify()方法顯式的喚醒,否則就永遠沉默。保證每一個wait()方法調用都有一個相對應的notify()調用,當然也可以調用notifyAll()方法以防萬一。

    posted on 2007-09-25 16:02 周銳 閱讀(1003) 評論(0)  編輯  收藏 所屬分類: Python
    主站蜘蛛池模板: 亚洲精品动漫免费二区| 亚洲校园春色另类激情| 免费h黄肉动漫在线观看| 国产一级做a爱免费视频| 亚洲精品午夜国产VA久久成人| 亚洲AV无码乱码国产麻豆穿越| 亚洲成a人片在线观看精品| 日韩在线不卡免费视频一区| 国产大片线上免费观看| 亚洲精品无码久久毛片| 亚洲人成在线影院| 国产精品亚洲精品爽爽| 在线观看免费视频一区| 成人午夜视频免费| 亚洲va久久久噜噜噜久久男同| 国产午夜免费高清久久影院| 成人在线视频免费| 黄色网址大全免费| 无码国产精品一区二区免费I6| 亚洲中文字幕久久久一区| 131美女爱做免费毛片| 亚洲片国产一区一级在线观看 | 亚洲伦理中文字幕| 午夜小视频免费观看| 亚洲国产综合91精品麻豆| 国产a视频精品免费观看| 亚洲人成在线播放网站岛国| 可以免费看黄视频的网站| 亚洲精品在线电影| 久久这里只精品99re免费| 亚洲色自偷自拍另类小说| 亚洲AV无码一区二区三区电影 | 亚洲国产精品成人综合色在线婷婷| 亚洲精品视频免费观看| 免费看的黄色大片| www免费黄色网| 亚洲精品无码久久毛片波多野吉衣| 在线免费观看a级片| 国产精品高清视亚洲一区二区| 国国内清清草原免费视频99 | 免费无码又爽又刺激高潮视频|