42.3 避免数据竞争
避免数据竞争的最好方法是不共享数据。将感兴趣的数据保存在局部变量中,保存在不与其他线程共享的自由存储中,或是保持在thread_local内存中(见42.2.8节)。不要将这类数据的指针传递给其他thread。当另一个thread需要处理这类数据时(如并行排序),传递数据特定片段的指针并确保在任务结束之前不触碰此数据片段。
这些简单规则背后的思想是避免并发数据访问,因此程序不需要锁机制且能达到最高效率。在不能应用这些规则的场合,例如有大量数据需要共享的场合,可使用某种形式的锁机制:
·互斥量(mutex):互斥量(互斥变量,mutual exclusion variable)就是一个用来表示某个资源互斥访问权限的对象。为访问资源,先获取互斥量,然后访问数据,最后释放互斥量(见5.3.4节和42.3.1节)。
·条件变量(condition variable):一个thread用条件变量等待另一个thread或计时器生成的事件(见5.3.4.1节和42.3.4节)。
严格来说,条件变量不能防止数据竞争,而是帮我们避免引入可能引起数据竞争的共享数据。
42.3.1 互斥量
mutex对象用来表示资源的互斥访问。因此,它可用来防止数据竞争以及同步多个thread对共享数据的访问。
“普通”mutex是最简单、最小也最快的互斥量。递归和限时互斥量增加了功能,但也带来了少量额外开销,这一开销对特定机器上的特定应用可能很严重,但也可能并不重要:
在任何时刻,一个互斥量只能被一个thread所拥有: ...
Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.