Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以原子方式递增或递减非std::原子整数类型 P> >在C++中,假设我有以下16字节类型,它可以对具有 CMPXCHG16B < /C> >的CPU进行原子操作: #include <atomic> #include <cstdio> struct foo { size_t _x; void* _y; foo(size_t x = 3, void* y = nullptr): _x(x), _y(y){} }; int main() { std::atomic<foo> f1; foo f2; foo f3(2, new int(4)); f1.compare_exchange_strong(f2, f3); std::printf("is always lock free %s\n", std::atomic<foo>::is_always_lock_free ? "true" : "false" ); }_C++_Stdatomic - Fatal编程技术网

如何以原子方式递增或递减非std::原子整数类型 P> >在C++中,假设我有以下16字节类型,它可以对具有 CMPXCHG16B < /C> >的CPU进行原子操作: #include <atomic> #include <cstdio> struct foo { size_t _x; void* _y; foo(size_t x = 3, void* y = nullptr): _x(x), _y(y){} }; int main() { std::atomic<foo> f1; foo f2; foo f3(2, new int(4)); f1.compare_exchange_strong(f2, f3); std::printf("is always lock free %s\n", std::atomic<foo>::is_always_lock_free ? "true" : "false" ); }

如何以原子方式递增或递减非std::原子整数类型 P> >在C++中,假设我有以下16字节类型,它可以对具有 CMPXCHG16B < /C> >的CPU进行原子操作: #include <atomic> #include <cstdio> struct foo { size_t _x; void* _y; foo(size_t x = 3, void* y = nullptr): _x(x), _y(y){} }; int main() { std::atomic<foo> f1; foo f2; foo f3(2, new int(4)); f1.compare_exchange_strong(f2, f3); std::printf("is always lock free %s\n", std::atomic<foo>::is_always_lock_free ? "true" : "false" ); },c++,stdatomic,C++,Stdatomic,所以我在寻找一种方法来做一些事情,比如 foo a1; fetch_add(&a1._x); 确保它充分对齐。使用C++20std::atomic\u ref,或使用与之相同的编译器功能(例如在GNU C兼容的编译器中使用\uu atomic\u fetch\u add)。或者作为一种不安全的黑客,将原子*指向您的var。确保所有潜在的并发读卡器都通过原子*读取。最近有一次问答,这也是答案,所以我认为是重复的。哦,等一下,你希望这在一个更大类型的成员上是安全的,它也是原子的。这是有问题

所以我在寻找一种方法来做一些事情,比如

foo a1;
fetch_add(&a1._x);

确保它充分对齐。使用C++20
std::atomic\u ref
,或使用与之相同的编译器功能(例如在GNU C兼容的编译器中使用
\uu atomic\u fetch\u add
)。或者作为一种不安全的黑客,将
原子*
指向您的var。确保所有潜在的并发读卡器都通过
原子*
读取。最近有一次问答,这也是答案,所以我认为是重复的。哦,等一下,你希望这在一个更大类型的成员上是安全的,它也是原子的。这是有问题的;有些编译器只会选择使
foo
非无锁。(例如MSVC)。GCC7和更高版本也会说它不是无锁的(因为它没有预期的只读可扩展性,除其他外),但在支持该指令的CPU上的libatomic函数中仍将使用lock cmpxchg16b。(不是第一代AMD K8)。请参阅,以了解有关黑客攻击
工会的更多信息。我可能是匆忙地将其作为副本关闭的;您能否澄清您对能够将整个
foo
对象与其中一个成员的原子读/写/RMW进行混合
compare\u exchange\u strong
有哪些要求?在X8664 ASM中,用<代码>锁定CMPXCHG16B < /COD>这是没有问题的,但是在ISOC++中可移植的问题是巨大的,除非<>代码STD::AcdiixReF对于使用部分重叠引用有什么要说。@ Per-Errordes不需要是ISO C++,只是在GCC、CLAN和MSVC之间有一些等价。您是否只关心为x86-64编译?还是AArch64?它确实有LDAXP/(加载链接/存储一对用于128位原子RMW的64位寄存器,但宽度相同。)32位ISA通常也支持64位原子RMW,因此如果编译器使用它们,事情会更容易。
foo a1;
fetch_add(&a1._x);