兩個執行緒同時呼叫同一個處理函式的互斥問題
阿新 • • 發佈:2019-02-19
問題背景:在工作中遇到過一個問題,就是在兩個執行緒同時呼叫同一個函式的時候,到底是應該在這個函式的內部什麼處理上加上互斥。原因又是什麼?
為了調查這個問題,我決定從以下三方面調查
1.執行緒中函式的呼叫
2.同一個程序中的兩個執行緒呼叫同一個處理函式
3.兩個不同程序中的兩個執行緒呼叫同一個處理函式
1.執行緒中函式的呼叫
每個程序都會有自己的虛擬地址空間,同一個程序中的每個執行緒都會在這個虛擬空間中,並被分配相應的資源。 執行緒中的函式實體是在記憶體中,而函式中的區域性變數則會一次被push到棧中。 如果是A函式呼叫B函式,則會先將A函式的引數和區域性變數push到佇列中,再將B函式的引數和區域性變數push到佇列中 具體如下(引數是以從右到左壓入棧中,__stdcall與__cdecl呼叫約定都是這麼處理的如果執行上面的函式在棧中會這樣變化
1:將fun函式的入力引數從右到左依次壓入到棧中。
2:將fun函式的指標壓入棧中
3:將ebp,ebx等暫存器入棧儲存
4:在棧中依次為各個變數分配空間
執行後的處理:
1.釋放變數空間
2.彈出個暫存器
3.ret,彈出eip,返回主調方程式碼
4.釋放參數空間