我正在阅读 n3485 中定义的 C++ 内存模型,它讨论了释放/获取语义,据我了解,以及此博客中给出的定义:
获取语义是一个只能应用于从共享内存读取的操作的属性,无论它们是读-修改-写操作还是普通加载。然后将该操作视为读取-获取。Acquire 语义可防止读取-acquire 的内存重新排序,以及按照程序顺序跟随它的任何读取或写入操作。
释放语义是一个只能应用于写入共享内存的操作的属性,无论它们是读-修改-写操作还是普通存储。然后该操作被认为是写释放。释放语义防止写释放的内存重新排序,任何读或写操作在程序顺序之前。
将防止在当前读/写完成之前或之后对读/写进行重新排序。第一个(获取)将确保当前正在完成的读取不会被任何读/写重新排序,后者(发布)将确保当前写入不会被之前的读/写操作重新排序它。
现在可以说std::mutex::lock
将具有获取语义并且std::mutex::unlock
本质上具有释放语义吗?
在标准中,我可以在部分下找到它
30.4.1.2 互斥体类型 [thread.mutex.requirements.mutex]
11 同步:
unlock()
对同一对象的先前操作应与(1.10)此操作同步。
据我了解,标准中没有明确定义同步,但是它似乎是一种发生在关系之前查看两个不同线程之间正在评估的两个语句的类型,但是,根据我对获取/释放语义的理解,这有更多与内存重新排序有关。 同步也可以称为释放/获取语义?
那么释放/获取语义是否不仅适用于加载/存储操作的重新排序,也适用于操作的线程内交错?
在关于内存模型的标准部分中,它主要讨论的是两个线程交错的有序关系。这对于这是否也适用于内存排序有待解释。
有人可以澄清吗?