-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 并且两个线程同时运行程序分别存入 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 回答