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