轉帖多線程編程使用互斥鎖同步線程

http://blog.csdn.net/u011249248/article/details/18659213



由於每個線程互相獨立,相互之間沒有任何關係,你幹你的,我幹我的,互相不干擾。

如果要幾個線程同時幹一件事怎麼辦,由於互相不走動,如果一個線程已經做過了,另一個線程再去做,不就重複了嗎,很容易亂套。

現在假設這樣一個例子:有一個全局的計數num,每個線程獲取這個全局的計數,然後將num加1。很容易寫出這樣的代碼:


運行結果:


這個結果肯定不對,紅色部分居然有重複的,某個線程都計算過了,另一個線程卻又計算了一遍。

問題產生的原因就是沒有控制多個線程對同一資源的訪問,對數據造成破壞,使得線程運行的結果不可預期。這種現象稱爲“線程不安全”。而我們希望的是你拍一,我拍二,你拍三,我拍四,大家按一次拍下去,最後得出計算結果。

數據共享。當多個線程都修改某一個共享數據的時候,需要進行同步控制。

線程同步能夠保證多個線程安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖爲資源引入一個狀態:鎖定/非鎖定。某個線程要更改共享數據時,先將其鎖定,此時資源的狀態爲“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性。

python中:

創建鎖

mu = threading.Lock()

鎖定

mu.acquire([timeout])

釋放

mu.release()

用鎖的概念實現上面的例子: 


這次檔案就正確了:

Thread-1 num is----1
Thread-2 num is----2
Thread-4 num is----3
Thread-3 num is----4
Thread-5 num is----5
Thread-6 num is----6
Thread-7 num is----7
Thread-9 num is----8
Thread-8 num is----9
Thread-11 num is----10
Thread-13 num is----11
Thread-10 num is----12
Thread-12 num is----13
Thread-14 num is----14
Thread-15 num is----15
Thread-17 num is----16
Thread-16 num is----17
Thread-18 num is----18
Thread-19 num is----19
Thread-20 num is----20


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章