多个线程的同步

多个线程的同步

2024 南京大学《操作系统:设计与实现》
多个线程的同步

并发控制:同步

Synchronization

  • 控制并发,使得 “两个或两个以上随时间变化的量在变化过程中保持一定的相对关系”
  • 有点抽象,让我们来看例子

理解并发的方法

  • 线程 = 我们自己
  • 共享内存 = 物理空间
2024 南京大学《操作系统:设计与实现》
多个线程的同步

现实世界中的同步 (1)

2024 南京大学《操作系统:设计与实现》
多个线程的同步

现实世界中的同步 (1)

演奏音乐中的同步

  • 每个乐手都是一个 “线程”
  • 节拍 ii 到达 → 演奏 nin_i
void T_player() {
    while (!end) {
        wait_next_beat();
        play_next_note();
    }
}
2024 南京大学《操作系统:设计与实现》
多个线程的同步

现实世界中的同步 (2)

今晚 23:59:59 大活门口,不见不散!

center

2024 南京大学《操作系统:设计与实现》
多个线程的同步

现实世界中的同步 (3)

在某个瞬间达到 “互相已知” 的状态

  • NPY: 等我洗个头就出门
  • NPY: 等我打完这局游戏就来
  • 舍友:等我修好这个 bug 就吃饭
  • 导师:等我出差回来就讨论这个课题
  • join(): 等所有线程结束就继续

“先到先等”,在条件达成的瞬间再次恢复并行

  • 同时开始出去玩/吃饭/讨论
2024 南京大学《操作系统:设计与实现》
多个线程的同步

状态机视角

系统到达某个 “同步” (互相已知) 的状态

void T_player() {
    while (!end) {
        wait_next_beat();
        play_next_note();
    }
}

void T_conductor() {
    while (!end) {
        wait_next_beat();
        release();
    }
}
  • release() 之后,player 都会演奏下一拍
2024 南京大学《操作系统:设计与实现》
多个线程的同步

第一个同步实现

自旋等待同步条件达成

  • 线程有先后,先来先等待
void wait_next_beat() {
retry:
    if (!next_beat_has_come) {
        goto retry;
    }
}
2024 南京大学《操作系统:设计与实现》