多執行緒 程序鎖機制的作用

2021-10-19 08:46:07 字數 4281 閱讀 7610

為了最大程度上了解鎖的機制,此處使用c++來進行編碼

(python其實也比較好哈哈哈哈)

以下**為不加鎖的時候的**,毫無疑問是亂序的,因為兩個執行緒同時操作了全域性變數

#include

#include

#include

#include

// 全域性變數

std::mutex my_mutex;

list<

int> l;

// 寫入函式

void

func1()

}// 讀取函式

void

func2()

}int

main

(int argc,

char

const

* ar**)

下面有兩種加鎖方式,一種是全部寫入再全部讀出

#include

#include

#include

#include

// 全域性變數

std::mutex my_mutex;

std::list<

int> l;

// 寫入函式

void

func1()

}// 讀取函式

void

func2()

}}intmain

(int argc,

char

const

* ar**)

可以看到,完全沒有問題

第二種是一邊寫入一邊讀出!!

#include

#include

#include

#include

// 全域性變數

std::mutex my_mutex;

std::list<

int> l;

// 寫入函式

void

func1()

}// 讀取函式

void

func2()

}}intmain

(int argc,

char

const

* ar**)

這個過程我來稍微解釋一下蛤:

對兩個執行緒進行阻塞,防止主線程執行完之前子執行緒沒有執行完

第乙個子執行緒在迴圈內加鎖後對全域性變數l進行寫入乙個資料,然後解鎖,此時l中有乙個資料即1

全域性變數此時是被解鎖的被釋放的資源,而此時有兩個執行緒是阻塞的狀態,在等待事件,而此時l是被釋放,而在兩個子執行緒之中都可以對l進行操作,此時就要競爭資源,哪乙個執行緒先執行就先進行加鎖和操作再解鎖

依次迴圈往復,直到競爭的次序已經耗盡,所以執行緒結束。

注意:執行緒在競爭資源的時候執行緒也是在執行的,只是阻塞的時候在等待事件,如果競爭成功了可以進入加鎖,沒有競爭成功只有失去了這一次機會,每次只有乙個執行緒可以向前執行

之前看到一句話挺有道理:

如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行狀態,第乙個變為執行狀態的執行緒可以對互斥量加鎖,其他執行緒將會看到互斥鎖依然被鎖住,只能回去再次等待它重新變為可用。在這種方式下,每次只有乙個執行緒可以向前執行

python的話我也不介意寫一下

第一種情況

from threading import thread

from threading import lock

from queue import queue

# 定義全域性變數

list_thread =

lock = lock(

)def

func1()

: lock.acquire(

)for i in

range

(100):

print

("插入的資料為:"

, i)

lock.release(

)def

func2()

: lock.acquire(

)for i in

range

(100):

num = list_thread[-1

] list_thread.pop(i)

print

("刪除的資料為:"

, num)

lock.release(

)def

main()

: t1 = thread(target=func1)

t2 = thread(target=func2)

if __name__ ==

'__main__'

: main(

)

第二種情況

from threading import thread

from threading import lock

from queue import queue

# 定義全域性變數

list_thread =

lock = lock(

)def

func1()

:# lock.acquire()

for i in

range

(100):

lock.acquire(

) lock.release(

)print

("插入的資料為:"

, i)

# lock.release()

deffunc2()

:# lock.acquire()

for i in

range

(100):

lock.acquire(

) num = list_thread[-1

] list_thread.pop(i)

lock.release(

)print

("刪除的資料為:"

, num)

# lock.release()

defmain()

: t1 = thread(target=func1)

t2 = thread(target=func2)

if __name__ ==

'__main__'

: main(

)

但是python裡面有個好東西可以解決加鎖的問題,queue。

簡單的來說就是多執行緒需要加鎖,很可能會造成死鎖,而queue自帶鎖。所以多執行緒結合queue會好的很多

queue可以傳遞多執行緒的結果,用以代替return

import threading

import time;

from queue import queue

defjob(vec,res)

:for i in

range

(len

(vec)):

vec[i]

= vec[i]*2

res.put(vec)

defmain()

: res = queue(

) data=[[

1,2,

3],[

3,4,

5],[

2,2,

2],[

3,3,

3]]for i in

range

(len

(data)):

t=threading.thread(target=job,args=

(data[i]

,res)

) t.start(

) t.join()

result =

for j in

range

(len

(data)):

))print

(result)

if __name__ ==

'__main__'

: main(

)

[[2

,4,6

],[6

,8,10

],[4

,4,4

],[6

,6,6

]]

python多執行緒鎖機制

在多執行緒程式設計中常用到的乙個概念就是鎖,它用於將執行緒需要獨佔的資源進行加鎖,使用後再進行釋放,防止死鎖發生。此處給出乙個不加鎖的多執行緒例子 實現整數n在每個執行緒內加1並列印 usr bin python coding utf 8 import threading import time c...

多執行緒之鎖機制

多執行緒實現方式的其中之一是實現runnable方式,並且重寫run方法 package thrad author 子曰無衣 public class mythread implements runnable public mythread string name override public s...

php多執行緒和多程序的作用

使用多程序,子程序結束以後,核心會負責 資源 使用多程序,子程序異常退出不會導致整個程序thread退出,父程序還有機會重建流程。乙個常駐主程序,只負責任務分發,邏輯更清楚.多程序方式更加穩定,另外利用程序間通訊 ipc 也可以實現資料共享。共享記憶體,這種方式和執行緒間讀寫變數是一樣的,需要加鎖,...