i++不是原子操作,也就是說,它不是單獨一條指令,而是3條指令:
1、從內存中把i的值取出來放到CPU的寄存器中
2、CPU寄存器的值+1
3、把CPU寄存器的值寫回內存
如果是單線程操作,i++毫無問題;但是在多核處理器上,用多線程來做i++會有什么問題呢?
i++在兩個線程里邊分別執行100次,能得到的最大值和最小值分別是多少?
=========分析=======
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;
【其實他想什么時候從內存中拿 什么時候從cpu返回都是可以的可能的 我們這說的是一種可能】