并发加载和存储

时间:2013-11-02 15:23:27

标签: c multithreading concurrency system theory

在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,这怎么会有问题?我如何使用并发机制使这个过程线程安全?

1 个答案:

答案 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以将互斥锁的范围缩小到最小值。