在C中我有:
double balance;
void deposit(double amount)
{balance = balance +amount;}
机器语言:
load R1, balance
load R2, amount
add R1, R2
store R1, balance
如果变量余额包含500且两个线程同时运行程序分别存入300和200,这怎么会有问题?我如何使用并发机制使这个过程线程安全?
答案 0 :(得分: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
以将互斥锁的范围缩小到最小值。