兩個線程同時調用一個函數會出現什么情況?


最近在研究多線程,然后突然想到如果兩個線程同時訪問一個函數的話,要不要加鎖呢,加鎖怎么加,不加又怎樣這樣的問題..然后去網上找了些帖子學習學習......

上面的代碼明顯執行串了!!!!

函數本身只是代碼,代碼是只讀的,無論多少個線程同時調用都無所謂,因為是只讀嘛.但是函數里面總要用到暑假 ,如果數據屬性線程級別(比如函數形參-->局部變量-->存在棧上-->每個線程都有自己的棧),那么同時調用是沒關系的,因為用的都是本線程的數據;但是如果函數用到一些全局數據,比如全局變量,根據堆內存首地址去訪問的堆內存(形參傳入的),同時操作一個數據結構(如對一個鏈表有什么操作),靜態局部變量,那就不行了,必須要加鎖!!

 

http://blog.csdn.net/mq_ydn3102/article/details/8546722

1.線程中函數的調用

2.同一個進程中的兩個線程調用同一個處理函數

3.兩個不同的進程中的兩個線程調用同一個處理函數

 

1.線程中函數的調用:

每個進程都會有自己的虛擬地址空間,同一個進程中的每一個線程都會在這個虛擬空間中,並被分配相應的資源. 

線程中的函數實體實在內存中,而函數中的局部變量則會一次被push到棧中.

如果是A函數調用B函數,則會先將A函數的參數和局部變量push到棧中,再將B函數的參數和局部變量push到棧中

具體如下(參數是從右往左壓入棧中,__stdcall和__cdecl調用都是這么處理的):

void fun(param1, param2,. param3....paramN)
{
value1;
value2;
...
valueN;
}

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

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

2:將fun函數的指針壓入棧中

3:將ebp,ebx等寄存器入棧保存
4:在棧中依次為各個變量分配空間

執行后的處理:

1.釋放變量空間

2.彈出寄存器

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

4.釋放參數空間

2.兩個線程調用同一個函數

 兩個線程中的函數的局部變量由於是保存在不同的線程中,因此不需要進行互斥處理(除非有非棧內存在搗亂,這種情況必須要有互斥鎖)

3.兩個不同進程中的兩個線程調用同一個處理函數

同樣,兩個線程中的函數的局部變量由於是保存在不同的線程中,因此不需要進行互斥處理
 
結論:
因此需要互斥處理的,一般是函數中有全局變量,有動態申請的空間,有靜態局部變量,有需要進程數據循環發送(進程傳參數給線程)之類的操作需要進行互斥處理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM