兩個執行緒同時呼叫乙個函式會出現什麼情況

2021-07-22 06:43:32 字數 1242 閱讀 7137

最近在研究多執行緒,然後突然想到如果兩個執行緒同時訪問乙個函式的話,要不要加鎖呢,加鎖怎麼加,不加又怎樣這樣的問題..然後去網上找了些帖子學習學習......

上面的**明顯執行串了!!!!

函式本身只是**,**是唯讀的,無論多少個執行緒同時呼叫都無所謂,因為是唯讀嘛.但是函式裡面總要用到暑假 ,如果資料屬性執行緒級別(比如函式形參-->區域性變數-->存在棧上-->每個執行緒都有自己的棧),那麼同時呼叫是沒關係的,因為用的都是本執行緒的資料;但是如果函式用到一些全域性資料,比如全域性變數,根據堆記憶體首位址去訪問的堆記憶體(形參傳入的),同時操作乙個資料結構(如對乙個鍊錶有什麼操作),靜態區域性變數,那就不行了,必須要加鎖!!

1.執行緒中函式的呼叫

2.同乙個程序中的兩個執行緒呼叫同乙個處理函式

3.兩個不同的程序中的兩個執行緒呼叫同乙個處理函式

1.執行緒中函式的呼叫:

每個程序都會有自己的虛擬位址空間,同乙個程序中的每乙個執行緒都會在這個虛擬空間中,並被分配相應的資源. 

執行緒中的函式實體實在記憶體中,而函式中的區域性變數則會一次被push到棧中.

如果是a函式呼叫b函式,則會先將a函式的引數和區域性變數push到棧中,再將b函式的引數和區域性變數push到棧中

具體如下(引數是從右往左壓入棧中,__stdcall和__cdecl呼叫都是這麼處理的):

void fun(param1, param2,. param3....paramn)

如果執行上面的函式在棧中會這樣變化

1:將fun函式的傳入引數從右到左依次壓入到棧中。

2:將fun函式的指標壓入棧中

3:將ebp,ebx等暫存器入棧儲存

4:在棧中依次為各個變數分配空間

執行後的處理:

1.釋放變數空間

2.彈出暫存器

3.ret,彈出eip,返回主調方**

4.釋放引數空間

2.兩個執行緒呼叫同乙個函式

兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理(除非有非棧內存在搗亂,這種情況必須要有互斥鎖)

3.兩個不同程序中的兩個執行緒呼叫同乙個處理函式

同樣,兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理

結論:因此需要互斥處理的,一般是函式中有全域性變數,有動態申請的空間,有靜態區域性變數,有需要程序資料迴圈傳送(程序傳引數給執行緒)之類的操作需要進行互斥處理

兩個執行緒同時呼叫同乙個處理函式的互斥問題

問題背景 在工作中遇到過乙個問題,就是在兩個執行緒同時呼叫同乙個函式的時候,到底是應該在這個函式的內部什麼處理上加上互斥。原因又是什麼?為了調查這個問題,我決定從以下三方面調查 1.執行緒中函式的呼叫 2.同乙個程序中的兩個執行緒呼叫同乙個處理函式 3.兩個不同程序中的兩個執行緒呼叫同乙個處理函式 ...

兩個執行緒同時呼叫同乙個處理函式的互斥問題

問題背景 在工作中遇到過乙個問題,就是在兩個執行緒同時呼叫同乙個函式的時候,到底是應該在這個函式的內部什麼處理上加上互斥。原因又是什麼?為了調查這個問題,我決定從以下三方面調查 1.執行緒中函式的呼叫 2.同乙個程序中的兩個執行緒呼叫同乙個處理函式 3.兩個不同程序中的兩個執行緒呼叫同乙個處理函式 ...

乙個專案中不能同時出現兩個main函式

在寫兩個短程式的時候想著把兩個cpp檔案放到同乙個專案中比較省空間,然後就出現了下面的問題 main函式已經定義過,然後將專案中的乙個含有main函式的cpp檔案刪除之後再執行,可以執行 原因大概是main函式是程式的入口,乙個專案中只能有乙個 如果覺得建立多個主函式麻煩的話可以選擇在同乙個解決方案...