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