問題背景:在工作中遇到過一個問題,就是在兩個線程同時調(diào)用同一個函數(shù)的時候,到底是應(yīng)該在這個函數(shù)的內(nèi)部什么處理上加上互斥。原因又是什么? 為了調(diào)查這個問題,我決定從以下三方面調(diào)查 1.線程中函數(shù)的調(diào)用 2.同一個進程中的兩個線程調(diào)用同一個處理函數(shù) 3.兩個不同進程中的兩個線程調(diào)用同一個處理函數(shù) 1.線程中函數(shù)的調(diào)用每個進程都會有自己的虛擬地址空間,同一個進程中的每個線程都會在這個虛擬空間中,并被分配相應(yīng)的資源。 線程中的函數(shù)實體是在內(nèi)存中,而函數(shù)中的局部變量則會一次被push到棧中。 如果是A函數(shù)調(diào)用B函數(shù),則會先將A函數(shù)的參數(shù)和局部變量push到隊列中,再將B函數(shù)的參數(shù)和局部變量push到隊列中 具體如下(參數(shù)是以從右到左壓入棧中,__stdcall與__cdecl調(diào)用約定都是這么處理的): void fun(param1, param2,. param3....paramN) { value1; value2; ... valueN; } 如果執(zhí)行上面的函數(shù)在棧中會這樣變化 1:將fun函數(shù)的入力參數(shù)從右到左依次壓入到棧中。 2:將fun函數(shù)的指針壓入棧中 3:將ebp,ebx等寄存器入棧保存 執(zhí)行后的處理: 1.釋放變量空間 2.彈出個寄存器 3.ret,彈出eip,返回主調(diào)方代碼 4.釋放參數(shù)空間 2.兩個線程調(diào)用同一個函數(shù)兩個線程中的函數(shù)的局部變量由于是保存在不同的線程中,因此不需要進行互斥處理 3.兩個不同進程中的兩個線程調(diào)用同一個處理函數(shù)同樣,兩個線程中的函數(shù)的局部變量由于是保存在不同的線程中,因此不需要進行互斥處理 結(jié)論: 因此需要互斥處理的,一般是函數(shù)中有全局變量,有動態(tài)申請的空間,有靜態(tài)局部變量,有需要進程數(shù)據(jù)循環(huán)發(fā)送之類的操作需要進行互斥處理
|
|
來自: wwkfisker1 > 《待分類1》