小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

兩個(gè)線程同時(shí)調(diào)用同一個(gè)處理函數(shù)的互斥問(wèn)題

 wwkfisker1 2016-07-22

問(wèn)題背景:在工作中遇到過(guò)一個(gè)問(wèn)題,就是在兩個(gè)線程同時(shí)調(diào)用同一個(gè)函數(shù)的時(shí)候,到底是應(yīng)該在這個(gè)函數(shù)的內(nèi)部什么處理上加上互斥。原因又是什么?

為了調(diào)查這個(gè)問(wèn)題,我決定從以下三方面調(diào)查

1.線程中函數(shù)的調(diào)用

2.同一個(gè)進(jìn)程中的兩個(gè)線程調(diào)用同一個(gè)處理函數(shù)

3.兩個(gè)不同進(jìn)程中的兩個(gè)線程調(diào)用同一個(gè)處理函數(shù)


1.線程中函數(shù)的調(diào)用

每個(gè)進(jìn)程都會(huì)有自己的虛擬地址空間,同一個(gè)進(jìn)程中的每個(gè)線程都會(huì)在這個(gè)虛擬空間中,并被分配相應(yīng)的資源。
線程中的函數(shù)實(shí)體是在內(nèi)存中,而函數(shù)中的局部變量則會(huì)一次被push到棧中。
如果是A函數(shù)調(diào)用B函數(shù),則會(huì)先將A函數(shù)的參數(shù)和局部變量push到隊(duì)列中,再將B函數(shù)的參數(shù)和局部變量push到隊(duì)列中
具體如下(參數(shù)是以從右到左壓入棧中,__stdcall與__cdecl調(diào)用約定都是這么處理的):

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

如果執(zhí)行上面的函數(shù)在棧中會(huì)這樣變化

1:將fun函數(shù)的入力參數(shù)從右到左依次壓入到棧中。

2:將fun函數(shù)的指針壓入棧中

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

執(zhí)行后的處理:

1.釋放變量空間

2.彈出個(gè)寄存器

3.ret,彈出eip,返回主調(diào)方代碼

4.釋放參數(shù)空間

2.兩個(gè)線程調(diào)用同一個(gè)函數(shù)

兩個(gè)線程中的函數(shù)的局部變量由于是保存在不同的線程中,因此不需要進(jìn)行互斥處理

3.兩個(gè)不同進(jìn)程中的兩個(gè)線程調(diào)用同一個(gè)處理函數(shù)

同樣,兩個(gè)線程中的函數(shù)的局部變量由于是保存在不同的線程中,因此不需要進(jìn)行互斥處理

結(jié)論:
因此需要互斥處理的,一般是函數(shù)中有全局變量,有動(dòng)態(tài)申請(qǐng)的空間,有靜態(tài)局部變量,有需要進(jìn)程數(shù)據(jù)循環(huán)發(fā)送之類的操作需要進(jìn)行互斥處理

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多