步骤 4 / 9
互斥:同一时刻只让一个线程进
用一把锁把“加 1”包起来,进去前先拿锁。
访问共享数据的那段代码叫“临界区”。 线程进入前先 pthread_mutex_lock,出来后 unlock;锁被别人拿着时只能等。 这样“读、算、写”三步就不会被另一个线程插进来。
操作系统
多个线程同时改同一份数据会出错,锁保证同一时刻只有一个线程在改。
以 Linux 上两个线程同时给计数器加 1、用 pthread_mutex 保护为例。
步骤 4 / 9
用一把锁把“加 1”包起来,进去前先拿锁。
访问共享数据的那段代码叫“临界区”。 线程进入前先 pthread_mutex_lock,出来后 unlock;锁被别人拿着时只能等。 这样“读、算、写”三步就不会被另一个线程插进来。
| 当前状态 | 发生了什么 |
|---|---|
| 两个线程同时运行 | 两个线程读到同一个旧值,更新丢失 |
| 交错执行 | 执行顺序不可预测 |
| 动手实验 | 两个读都在写之前,丢一次更新 |
| 线程 1 持有锁 | 线程 1 独占临界区 |