Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++11顺序一致性内存顺序是否禁止存储缓冲石蕊测试?

C++11顺序一致性内存顺序是否禁止存储缓冲石蕊测试?
EN

Stack Overflow用户
提问于 2021-12-02 10:07:30
回答 1查看 232关注 0票数 1

考虑使用SC atomics进行的存储缓冲石蕊测试:

代码语言:javascript
运行
AI代码解释
复制
// Initial
std::atomic<int> x(0), y(0);

// Thread 1           // Thread 2
x.store(1);           y.store(1);
auto r1 = y.load();   auto r2 = x.load();

这个程序能以r1 r2 r2为0结束吗?

我看不出memory_order_seq_cst优先选择中的描述是如何禁止这个结果的

具有此内存顺序的加载操作执行获取操作,存储执行释放操作,读-修改-写同时执行获取操作和释放操作,再加上一个单独的总顺序,其中所有线程都以相同的顺序观察所有修改。

在我看来,memory_order_seq_cst只是在收购-发布,外加一个全球商店订单。我不认为全球商店的订单在这个特定的试金石测试中起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-02 23:35:34

SC的偏好摘要的太弱了,确实不够强,不足以禁止这种重新排序。

在我看来,它说的只有x86-TSO (acq_rel +没有IRIW重新排序,即所有读者线程都能同意的总的存储订单)。

ISO C++实际上保证了所有SC操作的总顺序(),包括负载、(以及SC栅栏),这与程序顺序一致。(这基本上是计算机科学中顺序一致性的标准定义;C++程序只使用seq_cst原子操作,它们的非原子访问是无数据竞争的,它们的非原子访问连续执行,即“恢复顺序一致性”,尽管非原子访问允许完全优化。)顺序一致性必须禁止在同一线程中的任何两个SC操作之间的任何重新排序,甚至禁止StoreLoad重排序。

这意味着在每个seq_cst存储之后都会有一个昂贵的全障碍(包括seq_cst),或者例如,AArch64 STLR / LDAR不能彼此重新订购,但在其他情况下只能发布和获取wrt。与其他操作重新排序。(因此,如果以后没有在同一个线程中执行任何SC加载或RMW操作,那么AArch64上的缓存命中SC存储可能比x86便宜得多。)

请参阅https://eel.is/c++draft/atomics.order#4,它清楚地表明SC操作没有重新排序wrt。彼此。目前的标准草案说:

31.4 atomics.order

  1. 在所有memory_­order​::​seq_­cst memory_­order​::​seq_­cst操作(包括栅栏)上都有一个单一的总阶S,满足以下约束。首先,如果A和B是memory_­order​::​seq_­cst运算,而A强发生在B之前,则A在S中先于B。

其次,对于对象M上的每一对原子运算A和B,其中A是一致性-在B之前排序,S需要满足以下四个条件:

  • (4.1) 如果A和B都是memory_­order​::​seq_­cst运算,则A在S中先于B;
  • (4.2 . )4.4)操作。

前面的排序意味着之前会发生强烈的情况,所以开头的段落保证S与程序顺序一致。

4.1是指在彼此之前/之后是相干有序的操作。也就是说,碰巧从存储中看到值的负载。这将线程间可见性与总订单S联系起来,使其与程序顺序相匹配。这两种需求的结合迫使编译器使用完整的屏障(包括StoreLoad)从它瞄准的任何较弱的硬件模型中恢复顺序一致性。

(在原文中,所有4.都是一段。我把它分开来强调,这里有两种不同的东西,一种是为了强-发生-之前和行动/障碍的一致性-有序-之前。)

这些保证,加上以前发生的同步,足以恢复整个程序的顺序一致性,如果它是无数据竞争的(这将是UB),如果您不使用任何较弱的内存顺序。

如果程序涉及较弱的订单,这些规则仍然有效,但例如,两个relaxed操作之间的SC围栏不如两个SC负载强。例如,关于不排除IRIW重新排序的PowerPC只使用SC操作;IIRC PowerPC在加载SC之前和之后都需要设置屏障。

因此,拥有一些SC操作并不一定足以在任何地方恢复顺序一致性;这正是使用较弱操作的意义所在,但其他操作可以重新排序wrt,这可能有点令人惊讶。军控行动。特种部队不是警戒线。还请参阅这是一个具有相同“存储缓冲区”测试的例子的问答。:将一个商店从seq_cst削弱为release允许重新排序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70204442

复制
相关文章
DreamweaverCS6安装时出错的解决教程
目前,CS6 是 Adobe dreamweaver 的最新版本,增强了对 jQuery 、jQuery Mobile 、HTML5 和 CSS3 的支持,优化了FTP功能,及时保存在本地和远程服务器,更有利于团队协作,当然我之前用的是很老的版本,今天同事在安装的时候出现"0xc000007b"错误代码,然后整理里一下解决方案。
李洋博客
2021/06/15
2.9K0
quartus ii运行错误_安装quartus时弹出错误
Info: ******************************************************************* Info: Running Quartus II 64-Bit Analysis & Synthesis Info: Version 11.0 Build 157 04/27/2011 SJ Full Version Info: Processing started: Thu May 15 13:09:59 2014 Info: Command: quartus_map –read_settings_files=on –write_settings_files=off simulate -c simulate Info: Parallel compilation is enabled and will use 2 of the 2 processors detected Info: Found 1 design units, including 1 entities, in source file simulate.v Info: Found entity 1: modelsim_test Error: Top-level design entity “simulate” is undefined
全栈程序员站长
2022/11/04
5.2K0
quartus ii运行错误_安装quartus时弹出错误
zblogasp安装时出错,左侧显示无法使用Access数据库
今天突然想起之前的一个网站博客,感觉还不错,但它是zblogasp的,所以想移植到zblogphp版本,但是把网站数据恢复之后登陆后台显示,数据库连接出错,因为asp+access类型,目录位置都对,所以可能是access数据库连接失败。
李洋博客
2021/06/15
4.8K0
Oracle创建Sequence时Order/NoOrder选项
Oracle创建Sequence时会有Order/NoOrder两个选项,那么到底什么场景用到Order,什么场景又用到NoOrder呢?
程序新视界
2022/11/30
7080
HttpWebRequest 在出错时获取response内容
HttpWebRequest 请求时,服务器会返回500 501这些错误 并包含错误信息,通过如下代码可以拿到错误信息
冰封一夏
2019/09/11
1.3K0
idea配置Tomcat时没有Artifacts选项
Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;
全栈程序员站长
2022/11/02
1.5K0
idea配置Tomcat时没有Artifacts选项
实战记录—PHP使用curl出错时输出错误信息
踩过的坑,实在不想再踩了,记录记录。 CURL错误列表 curl_exec($ch);//执行curl if (curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch);//出错输出错误 } curl_close($ch);//关闭curl 同理,像正则,Json,数据库这些出错时基本都会有提供有帮助的错误信息 CURL状态码列表 状态码 状态原因 解释 0 正常访问 1 错误的协议 未支持的协议。此版cURL 不支持这一协议。 2 初始
房东的狗丶
2023/02/17
6.3K0
MyBatis集成到Spring时配置MapperScannerConfigurer出错
在web项目中同时集成了spring mvc和mybatis。 将jdbc配置参数独立在外部配置文件中,然后通过<context:property-placeholder>引入。 此时在Spring中注入org.mybatis.spring.mapper.MapperScannerConfigurer,如下所示:
编程随笔
2019/09/11
2.5K0
WordPress 建立数据库连接时出错
WordPress 网站,需要在一个运行PHP 7.4或更高版本;数据库软件可采用MySQL 5.6或更高版本的服务器中才能运行的。
.T.
2022/02/19
5.4K0
WordPress 建立数据库连接时出错
wordpress建立数据库连接时出错
1、表单信息正确无误 2、安全组配置已更改 3、数据库远程连接已开启 4、数据库在3306端口正常运行并可连接 5、本地无法远程连接数据库
李玺
2022/08/03
3.3K0
wordpress建立数据库连接时出错
Nginx编译安装以及选项
编译安装Nginx 1、安装常见的工具和库(GCC、PCRE、zlib、OpenSSL)
星哥玩云
2022/07/14
9520
导出文件时,responseType设置为'arraybuffer'出错?
由于请求的时候设置了responseType:’arraybuffer’,返回的是数据流,要取得json信息需要进行转换:
用户2323866
2021/06/23
2.7K0
安装python扩展包pylint出错
用VSCode作为python的IDE,VSCode会提示安装pylint。pylint是python代码风格控制插件,如果你写的代码不符合常见风格,就会报错。使用pip安装pylint时往往会报错,如图所示
fem178
2018/07/25
1.6K0
安装python扩展包pylint出错
WiX安装选项--环境变量
系统环境变量由 Windows 定义并应用到所有计算机用户。对系统环境的更改将写入注册表,而且通常需要重启计算机才能生效。通常我们的程序中也会使用环境变量,如何在WiX设置环境变量呢? 安装一个环境变量,我们就需要向Environment table中添加一条记录,其中有几个字段是必须设置的: Environment - public key to be referenced from other tables. Name - name of the environment variable we wan
张善友
2018/01/19
1.4K0
Windows 安装svn(出错已解决)和MySQL安装[通俗易懂]
1.https://tortoisesvn.net/downloads.html网站下载
全栈程序员站长
2022/09/23
1.4K0
Windows 安装svn(出错已解决)和MySQL安装[通俗易懂]
xampp linux_xampp安装出错
xampp是一套很好使用的web服务器组合软件,这里教大家如何在linux安装搭建xampp,希望能帮助到你
全栈程序员站长
2022/11/17
3.4K0
linux下安装mysql-python出错
命令 pip install mysql-python 然后出错了: Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-build-YEYPJp/mysql-python/setup.py", line 17, in <module> metadata, options = get_config() File "setup_posix.py", line 43, i
零式的天空
2022/03/22
1.3K0
点击加载更多

相似问题

尝试安装Acumos时出错

118

尝试安装shinyapps时出错

12

尝试安装MSMQ时出错

10

尝试安装cldr时出错

17

尝试安装PyCrypto时出错

141
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档