如何以非原子方式访问 std::atomic<int> 的值

问题描述 投票:0回答:3

我的程序中有一个类型为

atomic<int>
的原子变量。在某些地方,我不需要原子地访问其中的值,因为我只需检查它是否为 0。换句话说,在这些情况下,我想避免原子访问时发生的总线锁定等开销。

如何非原子地访问原子变量。使用 (int) 对其进行类型转换是否足够,如下所示?如果没有,我想我该怎么做?

atomic<int> atm;
int x;
........
x = (int)atm; // Would this be a non-atomic access, no bus locking et all?
c++ atomic stdatomic
3个回答
5
投票

你无法摆脱原子性属性。但是您也许可以通过放宽内存排序保证来减少使用原子变量所涉及的一些开销。

std::atomic<int> a;

int value = a.load(std::memory_order_relaxed);
if(value == 0) {
    // blah!
}

但是我不建议这样做,并且我同意所有敦促您避免这样做的评论。您确定您为原子操作付出了足够高的成本,因此进行此黑客攻击并可能引入线程错误是值得的吗?


2
投票

在大多数平台上,读取 int (尤其是对齐的 int,堆栈变量)将是原子的,因此将其分配给 int 无论如何都是一个简单的分配。

如果变量无法按照上面所述以原子方式访问,那么您仍然需要将其分配以保证其不会被写一半..

即只需使用atomic<>变量。很好,而且更安全。


1
投票

我怀疑这是否有效,因为提供给强制转换的值仍然必须从原子中获取。我查看了 std::atomic< int > 专业化声明,但据我所知,以及他们对基类 std::atomic 的声明,无法访问底层变量。

那里有宏声明应该能够告诉您是否在您的平台上使用了锁,尽管我不确定这些是标准方法还是扩展方法。最糟糕的情况是,您可以只评估宏

ATOMIC_INT_LOCK_FREE
并查看它是否存在。 (注意:
atomic<int>
还可以处理其他事情,例如确保内存处于正确的边界等),尽管这对您的代码来说并不重要;它要么会,要么不会,而且似乎没有一种已定义的方法来获取 int。

您也可以只是玩弄它,通过将其设置为已知值来查看原子,然后使用调试器检查它或获取其地址并将其打印出来。您可以像这样玩一会儿,并可能找到一种方法来执行某种(不可移植的、非标准的)指针操作来获取指向该值的指针,然后将其存储在您想要执行非操作的任何地方。 -原子检查。

希望您找到您需要的东西!

© www.soinside.com 2019 - 2024. All rights reserved.