如何解决存储后的std :: atomic地址
在存储之后,我似乎无法获得原子对象的地址。
例如
std::atomic<int> i;
std::atomic<int>* p = &++i; // doesn't work
auto* p = &++i; // doesn't work
// below works:
++i;
auto* p = &i;
这里发生了什么,为什么?
为了澄清:我知道它返回一个r值。为什么它不返回原始对象this
?这是一个有目的的设计选择还是一个疏忽?
更具体地说,此要求在幕后发生了什么?
解决方法
虽然预递增运算符通常通过引用返回其操作数,但对于std::atomic
整数,它会作为临时值返回新值。因此,在您的示例中,++i
不会返回对atomic<int> i
本身的引用,而是返回i
的新值(即int)。您可以在https://en.cppreference.com/w/cpp/atomic/atomic/operator_arith
返回对原始atomic<int>
的引用将产生误导甚至危险,因为通过此引用访问int值将需要秒的单独读取操作-因此,值可能与增量时的值不同。 (这与示例代码并不特别相关,因为您仅尝试获取指向所引用对象的指针,但是某些代码实际上会访问++
之后的值,因此这就是为什么无法返回引用的原因)
换句话说,如果++i
返回了对atomic<int> i
的引用,则
int j = ++i;
将等同于
++i;
// ...other threads may modify the value of `i` here!...
int j = i;
原子的全部要点是作为不可分割的操作一起执行读取和写入操作,因此++i
必须在内部使用硬件/ OS原子操作来同时读取和递增整数,因此新值将返回为
如果您想知道问题的根源,可以在here is libc++'s implementation处看到operator++
只需调用fetch_add(1)
并返回结果+ 1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。