当多个线程共享数据时,它们的操作可能在一次多步更新的中途交错(interleave),产生一个 race condition——结果取决于不可预测的时序的 bug。同步(synchronization) 就是强制安全次序的一整套工具。
问题:一个 race condition
count++ 看起来是原子的,但实际上是读-改-写(read-modify-write):
c
读和写之间的那个窗口是一个 critical section——触碰共享状态、且不能被并发执行的代码。
pthread_mutex_lock(&m);
count++; // critical section — 独占
pthread_mutex_unlock(&m);
Lock 解决了 race,但引入了新风险:deadlock(线程互相等待对方的 lock)、priority inversion(优先级反转)和 contention(线程被串行化,扼杀了并行性)。经验法则:让 critical section 短,并且总是以一个一致的全局顺序获取多个 lock。
并发(concurrency)bug 属于最难查找的一类——它们是非确定性的,往往在 debugger 下就消失了。面试官想看到你能发现一个 critical section、选对 primitive(mutex vs semaphore vs atomic),并对失败模式(deadlock、contention)进行推理。这直接适用于任何多线程 server、共享 cache 或计数器。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠