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

时间:2011-08-29 18:29:55

标签: c++ 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?

3 个答案:

答案 0 :(得分:4)

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

std::atomic<int> a;

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

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

答案 1 :(得分:2)

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

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

即使用原子&lt;&gt;变量。它更好,更安全。

答案 2 :(得分:1)

我怀疑这会起作用,因为仍然必须从原子获得施加到演员表的价值。我浏览了std::atomic< int > specialization declaration,但据我所知,从他们对基类std :: atomic的声明中,没有办法访问底层变量。

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

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

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