Concurrency Hazards: Solving 11 Likely Problems In Your Multithreaded Code
http://msdn.microsoft.com/en-us/magazine/cc817398.aspx
update@201509: 链接已经失效
- Forgotten Synchronization(没有同步)
- Incorrect Granularity(不正确的锁粒度)
- Read and Write Tearing(逻辑上我们看上去读写一次内存,但是底层可能因为不对齐/大小原因读写两次)
- Lock-Free Reordering(里面还提到了recursive lock以及死锁问题)
- Lock Convoys(请求锁的速率高于critical section的处理速率,导致很多请求hang住。解决办法就是减少section大小和提高处理速度。这个问题完全是系统设计处理模型造成的,不过确实会造成性能问题)
- Two-Step Dance(发生的情况大致是如果A占有锁lock,但是触发事件造成B被唤醒,而B也需要lock但是没有办法占有,接着又切换回来,造成不必要的cs.不过我倒是觉得这个问题不是很常见的)
- Priority Inversion(这个完全是因为线程优先级造成的。低优先级占有lock,但是高优先级不断地被调度,但是因为lock问题没有成功,同样造成不必要的cs.感觉和上面问题倒是一样,只不过触发条件不同。个人觉得这个问题完全可以在scheduler上解决的)
- Patterns for Achieving Safety(后面三点都是关于获得thread safety的建议)
- Immutablity.数据不可变性
- Purity.方法没有side-effect
- Isolation.每个线程只有自己独立的数据.