同步库包括用于跨不同线程管理任务的抽象和原语。该库包含以下头文件:
mutex.h
提供用于管理资源锁的原语。互斥锁是这个库中最重要的原语,也是大多数并发实用程序的构建块。notification.h
提供一种简单的机制来通知线程事件。barrier.h
并blocking_counter.h
为累积事件提供同步抽象。
Abseilbase
库还包括许多与并发相关的头文件:
base/thread_annotations.h
提供用于记录多线程代码的锁定策略的宏,并为滥用此类锁定提供警告和错误。base/call_once.h
提供一个 Abseil 版本,std::call_once()
用于在所有线程中只调用一次可调用对象。
本文档将涵盖上述所有内容。
同步概述在顺序(即单线程)系统中,我们通常认为事件以特定的总顺序发生:对于任何操作 A 和 B,要么 A 发生在 B 之前,要么 B 发生在 A 之前。在并发系统中,这不再是情况:对于某些操作对,可能无法说哪个更早发生(即事件只是部分排序的),在这种情况下,我们说它们同时发生。请注意,此定义与它们是否“实际上”同时发生无关,而仅与我们是否可以保证它们不会发生有关。
如果在多线程环境中没有正确使用(或设计)并发操作可能会发生冲突,从而导致以下问题