步骤 1 / 9
问题:加 1 竟然会丢
两个线程同时给计数器加 1,结果可能只加了一次。
“加 1”看起来是一步,其实是三步:读出旧值、算出新值、写回去。 两个线程如果都先读到同一个旧值,各自加 1 再写回,一次更新就丢了。 这种取决于先后顺序的错误叫“竞态”,平时测不出,上线后偶尔出现。
操作系统
多个线程同时改同一份数据会出错,锁保证同一时刻只有一个线程在改。
以 Linux 上两个线程同时给计数器加 1、用 pthread_mutex 保护为例。
步骤 1 / 9
两个线程同时给计数器加 1,结果可能只加了一次。
“加 1”看起来是一步,其实是三步:读出旧值、算出新值、写回去。 两个线程如果都先读到同一个旧值,各自加 1 再写回,一次更新就丢了。 这种取决于先后顺序的错误叫“竞态”,平时测不出,上线后偶尔出现。
| 当前状态 | 发生了什么 |
|---|---|
| 两个线程同时运行 | 两个线程读到同一个旧值,更新丢失 |