测验:并发与锁
为什么 counter = counter + 1 会导致竞争条件?
- 因为其他线程可以在读、加、写这三个步骤之间进行干预。
- 这是因为编译器通过优化改变了顺序
- 因为发生整数溢出
- 因为没有缓存一致性协议
在什么情况下会自然地使用信号量而不是互斥体?
- 当你只想允许一个线程进入临界区时
- 当您需要在递归调用中重新获取相同的锁时
- 创建连接池时,将同时连接数限制为 5
- 当您只想强制持有锁的线程释放它时
为什么我们要等待条件变量,然后在醒来时重新检查条件?
- 这是因为条件变量不存储它们的值,每次都必须重新读取。
- 这是因为在等待过程中互斥体被自动释放,使得状态无效。
- 这是因为可能存在假唤醒,并且其他线程可能在唤醒期间改变了条件。
- 这是因为条件变量的信号会在队列中累积并稍后再次传递。
以下哪项不是死锁的四个必要条件之一?
- 互斥——一次只能使用一种资源
- 占用并等待 - 持有并等待另一个资源
- 循环大气——大气关系形成一个循环
- 饥饿——特定线程不断被推迟并且无法前进。
当多个代码路径频繁发生死锁时,最现实的预防措施是什么?
- 根本没有锁定
- 设置规则,以便所有代码以相同的顺序获取锁
- 将超时增加到无穷大
- 增加线程数
在什么情况下自旋锁比阻塞锁更有优势?
- 当只有一个核心时
- 当临界区很短并且延迟小于上下文切换成本时
- 在临界区内执行磁盘 I/O 时
- 当等待线程过多时
尽管按照“检查库存并扣除剩余库存”的逻辑提高了隔离级别以重复读取,但超卖仍在继续。最准确的诊断是什么?
- 这是一种写入偏差,其中两个事务读取同一组并更新不同的行,因此快照隔离无法捕获它。
- 由于未反映设置,因此它实际上以提交读取的方式运行。
- 这是因为由于缺少索引而导致锁定范围变窄。
- 这是因为连接池很小,所以事务很纠结,顺序也乱了。