使用2個執行緒對i=1進行自增(i ),每個執行緒各自執行100次,請問可能的最大值和最小值是多少?請給出解釋
另外問, i是否是原子性的?
PHP中文网2017-05-17 10:02:27
最小可以是 3,即 +2,最大 201,即 +200 。 。 。 。為什麼 i 不從 0 開始。 。 。
一次循環過程是:
從記憶體讀取資料到暫存器
暫存器值++
寫回資料到記憶體
一個線程可能在這三步中的任意一步被打斷。是3的情況是:
第一線程讀取資料1
,然後被掛起,暫存器的值被保存到另一個地方。 1
,然后被挂起,寄存器的值被保存到另一个地方。
第二个线程,持续执行了 99 次(此时,内存中的值为 100
),然后被挂起。
第一个线程被唤醒,恢复寄存器的 1
+1 之后 (=2
)被写回内存,该线程被挂起
第二个线程从内存读取2
到寄存器之后被挂起
第一个全部执行完,把值写回内存
唤起第二个线程,恢复寄存器中的2
第二個線程,持續執行了 99 次(此時,記憶體中的值為 100
),然後被掛起。
第一個執行緒被喚醒,恢復暫存器的1
+1 之後(=2
)被寫回記憶體,該執行緒被掛起3
第二個線程從記憶體讀取2
到暫存器之後被掛起
第一個全部執行完,把值寫回記憶體
喚起第二個線程,恢復暫存器中的2
,完成最後一次循環+1 之後寫回3所以最終結果是 🎜。 。 。 。 🎜 🎜還沒有想到更小的調度方式。 。 。 🎜 🎜最大值就不用太多解釋了。 。 。 。 🎜
PHP中文网2017-05-17 10:02:27
最小值為2,最大值為200。
2就是兩個執行緒都在CPU快取修改數據,最後記憶體只刷新了一次
200 就是兩個執行緒交替讀取並修改,互相不競爭。
都問最大值最小值了,自然不是原子性的。