11. 测试和调试多线程应用
Unwanted blocking
- Deadlock
- Livelock,和死锁的区别是在循环中积极检查条件,比如自旋锁,线程一直消耗 CPU 但始终无法前进
- Blocking on I/O or other external input,线程在等待一个不定期的、可能永远不会到来的操作
Race conditions
- Data races
- Broken invariants
- Lifetime issues
Code review
- 在并发访问下,哪些数据需要保护?
- 如何确保数据受到保护?
- 此时其他线程可能位于代码的哪个部分?
- 当前线程持有哪些互斥锁?
- 其他线程可能持有哪些互斥锁?
- 在当前线程中执行的操作与在其他线程中执行的操作之间是否存在顺序要求?如何确保这些要求得到满足?
- 当前线程加载的数据是否仍然有效?是否可能已被其他线程修改?(比如 CAS、双重校验锁)
- 如果假设其他线程可能正在修改数据,这意味着什么?如何确保这种情况永远不会发生?
Testing
书 P345 给出了一些对线程安全队列进行测试的测试点。