Review & Comments

Review & Comments

2024 南京大学《操作系统:设计与实现》
Review & Comments

感谢同学发现的 Bug!

We can't do this!

  • 从循环 10 次改成循环 1 次,sum 错了!
void unlock() {
    // To be safer:
    //
    // asm volatile (
    //     "movl %1, %0"
    //     : "=m" (status)
    //     : "r" (UNLOCKED)
    //     : "memory"
    // );

    // But actually we can do this:
    status = UNLOCKED;
}
2024 南京大学《操作系统:设计与实现》
Review & Comments

为什么不能?

分析:手工 inline

do {
    asm volatile("...");
} while (expected != UNLOCKED);
sum++;
status = UNLOCKED;

忘记了一个 Compiler Barrier

2024 南京大学《操作系统:设计与实现》
Review & Comments

结论

并发编程:不能相信自己

  • 并发 bug 的触发需要:
    • 编译器 + 编译选项 + 特别的机器 + 特别的运气
  • 内存模型:专家也做不对
  • 测试全对
    • Online Judge 被拒绝 😭

初学者:如果可以,只用 “绝对正确” 的实现

  • 自带一切 barrier 的函数
    • atomic_xchg
    • pthread_mutex_lock
2024 南京大学《操作系统:设计与实现》