i++在兩個執行緒裡邊分別執行100次,能得到的最大值和最小值分別是多少?(答案是200和2)
i++不是原子操作,也就是說,它不是單獨一條指令,而是3條指令:
1、從記憶體中把i的值取出來放到CPU的暫存器中
2、CPU暫存器的值+1
3、把CPU暫存器的值寫回記憶體
如果是單執行緒操作,i++毫無問題;但是在多核處理器上,用多執行緒來做i++會有什麼問題呢?
我再仔細地重複一遍問題:程序有一個全域性變數i,還有有兩個執行緒。每個執行緒的功能,就是迴圈100次,執行i++。問執行緒程式碼全部執行完畢後,i的值是否一定是200?如果不是,它的最大最小值是多少?
=========分析=======
i++是由3條指令構成的運算操作,兩個執行緒在i變數上共計需要執行100(次迴圈)*3(條指令)*2(個執行緒)=600條指令,這600條指令在某種排列下會導致最終i的值僅為2。
(下面是我複製過來的)
假設兩個執行緒的執行步驟如下:
1. 執行緒A執行第一次i++,取出記憶體中的i,值為0,存放到暫存器後執行加1,此時CPU1的暫存器中值為1,記憶體中為0;
2. 執行緒B執行第一次i++,取出記憶體中的i,值為0,存放到暫存器後執行加1,此時CPU2的暫存器中值為1,記憶體中為0;
3. 執行緒A繼續執行完成第99次i++,並把值放回記憶體,此時CPU1中暫存器的值為99,記憶體中為99;
4. 執行緒B繼續執行第一次i++,將其值放回記憶體,此時CPU2中的暫存器值為1,記憶體中為1;
5. 執行緒A執行第100次i++,將記憶體中的值取回CPU1的暫存器,並執行加1,此時CPU1的暫存器中的值為2,記憶體中為1;
6. 執行緒B執行完所有操作,並將其放回記憶體,此時CPU2的暫存器值為100,記憶體中為100;
7. 執行緒A執行100次操作的最後一部分,將CPU1中的暫存器值放回記憶體,記憶體中值為2;