1
float myTotalAmount=0; 
void update(float amt){ 
    myTotalAmount+= amt; 
} 

任務A致電update(10);上下文切換如何影響變量的修改?

任務B調用update(5);

如何競爭狀況影響的myTotalAmount的結果呢?

任務B能夠調用更新方法,因爲上下文切換髮生由於某種原因之前任務A完成了嗎?我想了解race condition

+0

我投票結束這個問題作爲題外話,因爲它屬於cs.stackexchange.com –

回答

1

int myTotalAmount = 0

任務A

Updata(10);

任務B

Updata(5)


myTotalAmount+= amt;不是原子操作。從這個意義上說,這條線將被翻譯成多個機器命令。

話雖這麼說,任務A將節省的myTotalAmount值在寄存器中,該值將是0。如果上下文切換現在happends和Task B開始運行時,它會修改myTotalAmount是5.現在的操作系統決定再次運行Task A。 即使myTotalAmount的值現在爲5,我們已經提取了該值並將其保存在一個寄存器中,它是0。執行將繼續從myTotalAmount0。現在myTotalAmount將獲得分配0+10,它將是10而不是15

要解決此問題,您可以部署一些同步以防止競爭條件。你可以使用鎖定。