首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >原子可以抵消递减的增量吗?

原子可以抵消递减的增量吗?
EN

Stack Overflow用户
提问于 2016-08-04 19:25:47
回答 2查看 218关注 0票数 8

使用relaxed memory order,例如引用计数指针,编译器会被允许优化掉后续的增量和减量吗?

代码语言:javascript
运行
复制
std::atomic_int32_t ai;
for (size_t i = 0; i < 10000; i++)
{
    ai.fetch_add(1, std::memory_order_relaxed);
    ai.fetch_sub(1, std::memory_order_relaxed);
}

看看反汇编,它看起来不像。但是由于重新排序是允许的,并且atomic的行为就像一个计数器,只是线程安全的,有人可能会说他可以优化,就像它是一个普通的整数一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-04 20:14:02

我相信它是可以优化的,除非声明为易失性。原因是,对于任何在其间交错一些线程的调度,都存在没有交错的有效调度。我相信drf-sc内存模型也是如此。

如果此线程读取介于两者之间的内容,则不会出现这种情况。

票数 4
EN

Stack Overflow用户

发布于 2016-08-04 20:09:46

编译器无法优化掉atomics,因为这会违背它们的用途。它必须假设另一个线程可能也会接触到该值,因此不允许移除。

它也不能优化/重新排序对C++代码“可见”的东西,因为原子是内存屏障。

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

https://stackoverflow.com/questions/38766077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档