在 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,这怎么会有问题呢?以及如何使用并发机制使这个过程线程安全?
在 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,这怎么会有问题呢?以及如何使用并发机制使这个过程线程安全?
并发 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
,以将互斥体的范围缩小到最小。