避免数据竞争的最好方法是不共享数据。将感兴趣的数据保存在局部变量中,保存在不与其他线程共享的自由存储中,或是保持在 thread_local内存中(见42.2.8节)。不要将这类数据的指针传递给其他 thread。当另一个 thread需要处理这类数据时(如并行排序),传递数据特定片段的指针并确保在任务结束之前不触碰此数据片段。
这些简单规则背后的思想是避免并发数据访问,因此程序不需要锁机制且能达到最高效率。在不能应用这些规则的场合,例如有大量数据需要共享的场合,可使用某种形式的锁机制:
- 互斥量(
mutex):互斥量(互斥变量, mutual exclusion variable)就是一个用来表示某个资源互斥访问权限的对象。为访问资源,先获取互斥量,然后访问数据,最后释放互斥量(见5.3.4节和42.3.1节)。 - 条件变量(condition variable):一个 thread用条件变量等待另一个 thread或计时器生成的事件(见5.34.1节和4234节)。
严格来说,条件变量不能防止数据竞争,而是帮我们避免引入可能引起数据竞争的共享数据。
