乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       wwkfisker1 2016-07-22

      問題背景:在工作中遇到過一個問題,就是在兩個線程同時調(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等寄存器入棧保存
      4:在棧中依次為各個變量分配空間

      執(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ā)送之類的操作需要進行互斥處理

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多