問題背景:在工作中遇到過乙個問題,就是在兩個執行緒同時呼叫同乙個函式的時候,到底是應該在這個函式的內部什麼處理上加上互斥。原因又是什麼?
為了調查這個問題,我決定從以下三方面調查
1.執行緒中函式的呼叫
2.同乙個程序中的兩個執行緒呼叫同乙個處理函式
3.兩個不同程序中的兩個執行緒呼叫同乙個處理函式
每個程序都會有自己的虛擬位址空間,同乙個程序中的每個執行緒都會在這個虛擬空間中,並被分配相應的資源。
執行緒中的函式實體是在記憶體中,而函式中的區域性變數則會一次被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.釋放引數空間
兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理
同樣,兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理
結論:因此需要互斥處理的,一般是函式中有全域性變數,有動態申請的空間,有靜態區域性變數,有需要程序資料迴圈傳送之類的操作需要進行互斥處理
兩個執行緒同時呼叫同乙個處理函式的互斥問題
問題背景 在工作中遇到過乙個問題,就是在兩個執行緒同時呼叫同乙個函式的時候,到底是應該在這個函式的內部什麼處理上加上互斥。原因又是什麼?為了調查這個問題,我決定從以下三方面調查 1.執行緒中函式的呼叫 2.同乙個程序中的兩個執行緒呼叫同乙個處理函式 3.兩個不同程序中的兩個執行緒呼叫同乙個處理函式 ...
多個執行緒呼叫同乙個執行緒函式
多個執行緒呼叫同乙個執行緒函式 如題,能這樣嗎?因為有很多個操作,但是這些操作都是一樣的,所以想用相同的執行緒函式,但是感覺執行時執行緒還是乙個乙個執行,並沒有提高速度,應該是我理解錯了!老大些幫幫忙,給個建議問題補充 我的意思是執行緒處理函式,剛剛找了點資料,覺得這想法沒有錯,只要執行緒裡面不用全...
兩個執行緒同時呼叫乙個函式會出現什麼情況
最近在研究多執行緒,然後突然想到如果兩個執行緒同時訪問乙個函式的話,要不要加鎖呢,加鎖怎麼加,不加又怎樣這樣的問題.然後去網上找了些帖子學習學習.上面的 明顯執行串了 函式本身只是 是唯讀的,無論多少個執行緒同時呼叫都無所謂,因為是唯讀嘛.但是函式裡面總要用到暑假 如果資料屬性執行緒級別 比如函式形...