-1

CI には次のものがあります。

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

機械語:

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

変数 balance に 500 が含まれていて、2 つのスレッドがそれぞれ 300 と 200 を同時に入金する手順を実行する場合、これはどのように問題になるのでしょうか? また、同時実行メカニズムを使用してこのプロシージャをスレッドセーフにするにはどうすればよいでしょうか?

4

1 に答える 1

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し、最後に解放します。ミューテックスのスコープを最小限に抑えるために、ロードするamount前にロードすることを検討してください。balance

于 2013-11-02T15:29:33.477 に答える