当前位置: 首页 > 知识库问答 >
问题:

标准C++11保证'volatile atomatic'同时具有两种语义(volatile+atomatic)吗?

从劲
2023-03-14
  • 融合操作:a=1;a=2;可以由a=2;
  • 上的编译器替换
  • 常数传播:a=1;local=a;可以被a=1上的编译器替换;本地=1;

跨原子/易失性操作的普通读/写的重新排序:

  • 对于volatile int a;任何volatile读/写操作都不能重新排序。但附近的普通读/写仍然可以围绕易变读/写重新排序。
  • 对于std::atomic A;根据用于原子操作的内存屏障,对附近普通读/写的重新排序受到限制a.load(std::memory_order_...);
    null

但是如果需要,这两个都具有不寻常的语义,并且具有无锁编码所需的任何或所有原子性和/或排序保证,即如果需要volatile std::atomic<>,由于以下几个原因需要:

  • 排序:防止对普通读/写进行重新排序,例如,从CPU-RAM读取,数据已使用设备DMA-Controller

例如:

char cpu_ram_data_written_by_device[1024];
device_dma_will_write_here( cpu_ram_data_written_by_device );

// physically mapped to device register
volatile bool *device_ready = get_pointer_device_ready_flag();

//... somewhere much later
while(!device_ready); // spin-lock (here should be memory fence!!!)
for(auto &i : cpu_ram_data_written_by_device) std::cout << i;
    null
char cpu_ram_data_will_read_by_device[1024];
device_dma_will_read_it( cpu_ram_data_written_by_device );

// physically mapped to device register
volatile bool *data_ready = get_pointer_data_ready_flag();

//... somewhere much later
for(auto &i : cpu_ram_data_will_read_by_device) i = 10;
data_ready=true; //spilling cpu_ram_data_will_read_by_device to RAM, should be memory fence
    null
  1. volatile中所述:避免如问题开头所述的融合操作和常数传播
  2. std::atomic:引入内存栅栏以提供排序、溢出和原子化。

我们是否可以从volatile int*ptr;执行reinterpret_castvolatile std::atomic *

共有1个答案

郭翰墨
2023-03-14

是的,确实如此。

第29.6.5节“对原子类型操作的要求”

许多操作都是volatile限定的。“Volatile as device Register”语义在标准中没有改变。这个限定意味着,当将这些操作应用于易失性对象时,易失性得到了保留。

我查看了2008年至2016年的工作草案,所有的草案都是相同的文本。因此它应该应用C++11、C++14和C++17。

 类似资料:
  • 此代码在没有警告的情况下编译。标准对此是怎么说的? 声明为。因此,不应优化对此变量的读取。 但是,bar不是限定的。是否允许编译器优化对此的写入?.即。编译器将对进行读取访问,并允许丢弃该值,而不将其分配给(在L.7处)。 如果这是标准有话要说的特殊情况,可否请您加入该条款,并对标准的律师谈话进行解读?

  • 我们对非最终场有同样的保证吗?换句话说,某些线程是否可能观察到非空的引用,但字段为? 提前道谢!

  • 在C和C中都有效但具有不同语义学的语法示例是什么?换句话说,使用C和C编译器编译时产生不同输出的程序示例是什么?

  • 什么是标准?标准是对重复性事物和概念所做的统一规定,他以科学技术和实践经验的结合成果为基础,经有关方面协商一致,由主管机构批准,以特定形式发布作为共同遵守的准则和依据。 在这个标准概念大行其道的今天,如果大家在生活中稍微注意一下,其实可以很容易发现,我们生活在一个标准化的世界里,每个产品的外包装或者标签上都会注明相应的执行标准。标准贯穿着我们的衣食住行。。总而言之,标准无处不在。 当然标准具有行业

  • null 缺点: -o0标志将影响整个代码,而关键字只影响特定变量。例如,如果我们在一个小型微控制器上工作,这可能是一个问题,因为使用-o0可能会产生一个大的可执行文件。

  • 我有两张桌子, 这两个表之间的关系是CustomerNumber 我的客户地图 以及账户映射 函数i DAO QueryHelper。getCustomerCriteria 现在我只想搜索有银行账户的客户。我想在Hibernate中设置一个条件。但我就是不知道怎么做? 搜索时,您可以输入客户编号、客户名称、电话号码和/或城市,并选择要显示多少结果。 首先,我想我可以编写一个命名查询,但之后你就有了