<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C/C++整型變量賦值操作是原子性的嗎?

    • 發布:C++培訓
    • 來源:資料庫
    • 時間:2019-01-03 18:05

    整型變量賦值操作不是原子操作

    那么為什么整型變量的操作不是原子性的呢?常見的整型變量操作有如下幾種情況:

    給整型變量賦值一個確定的值,如

    int a = 1;

    這條指令操作一般是原子的,因為對應著一條計算機指令,cpu將立即數1搬運到變量a的內存地址中即可,匯編指令如下:

    mov dword ptr [a], 2

    然后這確是最不常見的情形,由于現代編譯器一般有優化策略,如果變量a的值在編譯期間就可以計算出來(例如這里的例子中a的值就是1),那么a這個變量本身在正式版本的軟件中(release版)就很有可能被編譯器優化掉,使用a的地方,直接使用常量1來代替。所以實際的執行指令中,這樣的指令存在的可能性比較低。

    變量自身增加或者減去一個值,如

    a ++;

    從C/C++語法的級別來看,這是一條語句,是原子的;但是從實際執行的二進制指令來看,也不是原子的,其一般對應三條指令,首先將變量a對應的內存值搬運到某個寄存器(如eax)中,然后將該寄存器中的值自增1,再將該寄存器中的值搬運回a的內存中:

    mov eax, dword ptr [a] inc eaxmov dword ptr [a], eax

    現在假設a的值是0,有兩個線程,每個線程對變量a的值遞增1,我們預想的結果應該是2,可實際運行的結果可能是1!是不是很奇怪?分析如下:


    我們預想的結果是線程1和線程2的三條指令各自執行,最終a的值為2,但是由于操作系統線程調度的不確定性,線程1執行完指令①和②后,eax寄存器中的值為1,此時操作系統切換到線程2執行,執行指令③④⑤,此時eax的值變為1;接著操作系統切回線程1繼續執行,執行指令⑦,得到a的最終結果1。

    把一個變量的值賦值給另外一個變量,或者把一個表達式的值賦值給另外一個變量,如

    int a = b;

    從C/C++語法的級別來看,這是也是一條語句,是原子的;但是從實際執行的二進制指令來看,由于現代計算機CPU架構體系的限制,數據不可以直接從內存搬運到另外一塊內存,必須借助寄存器中斷,這條語句一般對應兩條計算機指令,即將變量b的值搬運到某個寄存器(如eax)中,再從該寄存器搬運到變量a的內存地址:

    mov eax, dword ptr [b] mov dword ptr [a], eax

    既然是兩條指令,那么多個線程在執行這兩條指令時,某個線程可能會在第一條指令執行完畢后被剝奪CPU時間片,切換到另外一個線程而產生不確定的情況。這和上一種情況類似,就不再詳細分析了。

    說點題外話,網上很多人強調某些特殊的整型數值類型(如bool類型)的操作是原子的,這是由于,某些CPU生產商開始有意識地從硬件平臺保證這一類操作的原子性,但這并不是每一種類型的CPU架構都支持,在這一事實成為標準之前,我們在多線程操作整型時還是老老實實使用下文介紹的原子操作或線程同步技術來對這些數據類型進行保護。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:國外程序員整理的 C++ 資源大全
    下一篇:聽說C語言指針很難,這個我怎么不覺得呢?

    超全的C語言標識符知識

    C指針——指針類型轉換

    C指針——指針和結構類型的關系

    C指針——數組和指針的關系

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>