繁体   English   中英

访问C ++ 0x的原子<int>为非原子

[英]Accessing atomic<int> of C++0x as non-atomic

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

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

atomic<int> atm;
int x;
........
x = (int)atm; // Would this be a non-atomic access, no bus locking et all?

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

std::atomic<int> a;

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

我不建议这样做,我回应所有的评论,敦促你避免这种情况。 你确定你为原子操作支付了足够高的成本吗?做这个黑客并可能引入线程错误值得吗?

在大多数平台上读取一个int(特别是一个对齐的,一个堆栈变量将是)无论如何都是原子的,所以只需将它分配给一个int将是一个简单的赋值。

如果变量不能如上所述原子地访问,那么你仍然需要将其分配以保证它不是半写的。

即只需使用原子<>变量。 它很好,更安全。

我怀疑这是否有效,因为仍然必须从原子获得施加到演员表的价值。 我查看了std :: atomic <int>特化声明,但据我所知,从它们的基类std :: atomic的声明中,没有办法访问底层变量。

那里有宏声明应该可以告诉你是否为你的平台使用了锁,尽管我不确定这些是标准还是扩展方法。 最糟糕的情况是,您可以只评估宏ATOMIC_INT_LOCK_FREE并查看它是否存在。 (注意: atomic<int>处理其他事情,例如确保内存位于适当的边界等),尽管对你的代码来说并不重要; 它要么会或者不会,并且似乎没有一种定义的方式来获得int。

您也可以通过将其设置为已知值然后使用调试器或通过获取其地址并将其打印出来来查看原子来查看原子。 你可以像这样玩一下,并且可能找出一种方法来做某种(非便携的,非标准的)指针操作来获取指向值的指针,然后将它存储在你想做的非你想到的地方 - 原子检查。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM