Sharing Data & Race Conditions
多线程编程的一个经典问题就是Race Condition。
What is a Race Condition?
race condition是多线程编程的一个经典bug,它指的是当多个线程并行执行某些操作时,它们访问公共的内存区域。此时有若干个线程回去修改这篇内存区域的的数据。
A Practical example of Race Condition
假设有这样的一个钱包类,我们提供一个成员函数addMoney():
1 | class Wallet |
接着我们创建5个线程,共享这个钱包类的对象,并行地添加1000到哪步的money变量,预期结果钱包类的结果应该是5000。
1 | int testMultithreadedWallet() |
但由于并发时,mMoney++并不是原子操作,而是分为三个机器指令:
- 从存储加载mMoney到寄存器;
- 递增寄存器的值;
- 把寄存器的值更新回存储;
以下是出现的几种非预期结果:
1 | Error at count = 14 Money in Wallet = 4000 |