2013-11-02 42 views
-1

在CI有:並行加載和存儲

double balance; 
void deposit(double amount) 
{balance = balance +amount;} 

機器語言:

load R1, balance 
load R2, amount 
add R1, R2 
store R1, balance 

如果變量平衡包含500個和兩個線程運行的程序分別存入300和200同時,如何能這有問題嗎?我如何使用併發機制來使這個過程線程安全?

回答

4

併發101

Thread 1     Thread 2 

load R1, balance 
load R2, amount   load R1, balance 
add R1, R2    load R2, amount 
store R1, balance   add R1, R2 
          store R1, balance 

由線程1的寫丟失。 (有許多序列可以達到幾乎相同的結果。)

您通過鎖定balance來修復它,以便只有一個線程或另一個線程可以在加載和存儲之間訪問它。在序列的開始處獲取balance上的互斥鎖,並在最後釋放它。在加載balance之前,請考慮加載amount以將互斥鎖的範圍降至最低。

+0

非常感謝! – NewFile