c++ - C++ 标准中的栅栏定义 [n4713 中的 atomics.fences]
问题描述
[atomics.fences.2]:
如果存在原子操作 X 和 Y,则释放栅栏 A 与获取栅栏 B 同步,两者都对某个原子对象 M 进行操作,使得 A 在 X 之前排序,X 修改 M,Y 在 B 之前排序,并且 Y 读取值由 X 写入或由假设的释放序列中的任何副作用写入的值 X 将在它是一个释放操作时开始。
所以一个潜在的示例代码是这样的:
std::atomic<uint32_t> M;
//Thread K
std::atomic_thread_fence(std::memory_order::release); // release fence A sequenced before
M.store(1, std::memory_order::relaxed); // operation X: operating on atomic object M
//Thread J
M.load(std::memory_order::relaxed); // operation Y: operating on atomic object M -- reading sequenced before
std::atomic_thread_fence(std::memory_order::acquire); // acquire fence B
问题:
上面的代码是否反映了 [atomics.fences.2] 所说的内容?如果不是,它应该是什么样子?
我认为释放栅栏应该在操作 X 之后排序,因为释放栅栏试图使之前的存储对于获取栅栏(B)的其他线程可见,因此获取栅栏 B 应该在操作 Y 之前排序。不是吗?
解决方案
推荐阅读
- java - 异常 - java.lang.NoClassDefFoundError: javax/mail/Authenticator - 仅在编译我的 java 项目之后
- python - Sagemaker 为烧瓶模型部署超时
- sequelize.js - 如何使用 Sequelize 返回关联的赞美
- r - R中线性回归系数的约束
- java - java从活动目录中检索用户个人证书
- python - Selenium python 抓取创建多个非常大的 tmp 文件,如 tmp/.org.chromium.Chromium.wd0LE4/Default/chrome_debug.log
- amazon-web-services - AWS S3 GetObject 是否同时读取正在上传到 s3 的部分对象
- asp.net - ASP .NET Core FormsAuthentication Cookie
- javascript - GET http://127.0.0.1:3000/public/js/main.js net::ERR_ABORTED 404(未找到)
- reporting-services - 我正在尝试向 SSRS tablix 添加一列,该列必须在列组内但在行组之外