天天看點

android 線程互斥鎖,線程鎖(互斥鎖Mutex)及遞歸鎖

一、線程鎖(互斥鎖)

在一個程式内,主程序可以啟動很多個線程,這些線程都可以通路主程序的記憶體空間,在Python中雖然有了GIL,同一時間隻有一個線程在運作,可是這些線程的排程都歸系統,作業系統有自身的排程規則,是以就可能造成,

假設兩個線程都在通路 global count= 0, 每個程序都會執行 count +=1 。(1)(2)(3)第一個線程申請GIL然後,讀取global count到及程序到 cpu ,(4)然後cpu執行到一半,(5)把這個線程停了,将上下文儲存到自身寄存器中。注意這時候沒傳回結果。這時候解釋器就會把GIL釋放,

(6)(7)(8)第二個線程申請GIL執行如上步驟,讀取count= 0 ,cpu計算結束後将結果count=1 傳回,(10)(11)解釋器拿到結果進行指派,此時count=1,這個程序運作結束,(12)(13)然後cpu從寄存器中第一個線程的執行狀态,繼續執行,注意這個讀取的是寄存器中的上下文,就是第一次執行時 count= 0,及第一個線程的上下文。計算結果傳回count =1 傳回。就造成了結果的錯誤。

android 線程互斥鎖,線程鎖(互斥鎖Mutex)及遞歸鎖

1.1 python中的線程鎖(互斥鎖mutex)

使用threading子產品中的Lock類,得到一個全局鎖執行個體。然後 Lock()執行個體下 有一個 acquire 方法為加鎖, release 方法釋放鎖

import threading

count = 0

lock = threading.Lock() #申請一個鎖

def count_():

global count #聲明為全局變量

lock.acquire() #加鎖,鎖釋放前不予許其他程式執行

count += 1

lock.release() #執行完 ,釋放鎖

thread_list = []

for i in range(10):

t = threading.Thread(target= count_)

t.start()

thread_list.append(t)

for t in thread_list:

t.join() #主程式等待所有程式執行完畢

print('Count:{: ^4}'.format(count))

1.2 遞歸鎖

基本用不上,主要目的就是防止鎖裡面加鎖,然後程式無法解鎖退出。

import threading,time

def run1():

print("grab the first part data")

lock.acquire()

global num

num +=1

lock.release()

return num

def run2():

print("grab the second part data")

lock.acquire()

global num2

num2+=1

lock.release()

return num2

def run3():

lock.acquire()

res = run1()

print('--------between run1 and run2-----')

res2 = run2()

lock.release()

print(res,res2)

if __name__ == '__main__':

num,num2 = 0,0

lock = threading.RLock()

for i in range(10):

t = threading.Thread(target=run3)

t.start()

while threading.active_count() != 1:

print(threading.active_count())

else:

print('----all threads done---')

print(num,num2)

經典線程同步 互斥量Mutex

閱讀本篇之前推薦閱讀以下姊妹篇:

(轉)經典線程同步 互斥量Mutex

閱讀本篇之前推薦閱讀以下姊妹篇:

多線程面試題系列(7):經典線程同步 互斥量Mutex

前面介紹了關鍵段CS.事件Event在經典線程同步問題中的使用.本篇介紹用互斥量Mutex來解決這個問題. 互斥量也是一個核心對象,它用來確定一個線程獨占一個資源的通路.互斥量與關鍵段的行為非常相似, ...

秒殺多線程第七篇 經典線程同步 互斥量Mutex

本文轉載于:http://blog.csdn.net/morewindows/article/details/7470936 前面介紹了關鍵段CS.事件Event在經典線程同步問題中的使用.本篇介紹用 ...

轉--- 秒殺多線程第七篇 經典線程同步 互斥量Mutex

閱讀本篇之前推薦閱讀以下姊妹篇:

python 之 并發程式設計(守護線程與守護程序的差別、線程互斥鎖、死鎖現象與遞歸鎖、信号量、GIL全局解釋器鎖)

9.94 守護線程與守護程序的差別 1.對主程序來說,運作完畢指的是主程序代碼運作完畢2.對主線程來說,運作完畢指的是主線程所在的程序内所有非守護線程統統運作完畢,主線程才算運作完畢​詳細解釋:1.主 ...

JoinableQueue隊列,線程,線程于程序的關系,使用線程,線程的特點,守護線程,線程的互斥鎖,死鎖問題,遞歸鎖,信号量

1.JoinableQueue隊列 JoinableQueue([maxsize]):這就像是一個Queue對象,但是隊列允許項目的使用者通知生成者項目已經被成功處理.通知程序是使用共享的信号和條件變 ...

線程全局修改、死鎖、遞歸鎖、信号量、GIL以及多程序和多線程的比較

線程全局修改 x = 100 def func1(): global x print(x) changex() print(x) def changex(): global x x = 50 func ...

并發程式設計(五)——GIL全局解釋器鎖、死鎖現象與遞歸鎖、信号量、Event事件、線程queue

GIL.死鎖現象與遞歸鎖.信号量.Event事件.線程queue 一.GIL全局解釋器鎖 1.什麼是全局解釋器鎖 GIL本質就是一把互斥鎖,相當于執行權限,每個程序内都會存在一把GIL,同一程序内的多 ...

随機推薦

php二維數組排序的處理

一維數組排序可以使用asort.ksort等一些方法程序排序,相對來說比較簡單.二維數組的排序怎麼實作呢?使用array_multisort和usort可以實作 例如像下面的數組:    代碼如下: ...

在Handler.ashx檔案中使用session

使用jquery調用handler檔案中的方法,需要使用session,預設生成的檔案中,不可以直接使用session.按照以下步驟,即可以通過session與其他的aspx頁面的session進行數 ...

如何在search中動态的顯示和隐藏tree中的字段

在tree定義 invisible 來自context