根据thisreferencemanualForeverystd::atomic(whetherornotspecialized),std::atomic::value_typeisX.但是如果我尝试使用这种类型,我会得到一个编译错误。我用g++8.2.1试过了:$g++-std=c++11test.cctest.cc:Infunction‘intmain()’:test.cc:6:23:error:‘value_type’isnotamemberof‘std::atomic’std::atomic::value_typex=0;还有clang6.0.1$clang-std=c++11
我想这样做:union{std::atomicu128;struct{std::atomicu64_1;std::atomicu64_2;};};多个线程将读取和写入union的两个部分。安全吗?编辑:我使用Linux,x86_64,clang3.3Edit2:我希望能够递增和递减u64_1,读取u64_2,并写入u128(compare_exchange)Edit3:如果我使用atomicbuiltinfunctions会怎么样??union将如下所示:union{uint128_tu128;struct{uint64_tu64_1;uint64_tu64_2;};};u64_1将映
在x86处理器下,我不确定比较和交换原子操作与加载链接/存储条件操作之间的区别。后者比前者更安全吗?是第一个比第二个好吗? 最佳答案 共有三种常见的原子原语样式:Compare-Exchange、Load-Linked/Store-Conditional和Compare-And-Swap。CompareExchange操作将自动读取内存位置,如果它与比较值匹配,则存储指定的新值。如果读取的值与比较值不匹配,则不会进行存储。在任何情况下,该操作都会报告读取的原始值。Compare-And-Swap操作类似于CompareExchang
我为需要跨线程同步的非常简单的数据编写了一个容器。我想要顶级性能。我不想使用锁。我想使用“宽松”原子。部分是为了那一点额外的魅力,部分是为了真正理解它们。我在这方面做了很多工作,我正处于这段代码通过我对其进行的所有测试的地步。但这还不是完全“证据”,所以我想知道我是否遗漏了什么,或者我可以通过其他任何方式对此进行测试吗?这是我的前提:唯一重要的是节点被正确地压入和弹出,并且堆栈永远不会失效。我相信内存中的操作顺序只在一个地方很重要:在compare_exchange操作本身之间。这是有保证的,即使是宽松的原子。“ABA”问题通过为指针添加标识号来解决。在32位系统上,这需要一个双字co
假设,我有一个任务可能会被另一个线程取消。该任务在C函数中执行,另一个线程运行C++代码。我该怎么做?粗略的例子。C:voiddo_task(atomic_boolconst*cancelled);C++:std::atomic_boolcancelled;…do_task(&cancelled);现在,我创建了一个包含以下内容的文件atomics.h:#ifdef__cplusplus#includeusingstd::atomic_bool;#else#include#endif它似乎有效,但我看不到任何保证。我想知道,是否有更好(正确)的方法。 最佳答
我发现在实践中,对于各种C++11/C++14编译器,std::atomic有一个未定义的初始值,就像它是一个"生”类型。也就是说,我们期望对于表达式inta;a可以有任何值。对于表达式std::atomicb;b也可以有任何值。换句话说,std::atomicb;//bisundefined不等于std::atomicb{0};//b==0或到std::atomicb{};//b==0因为在后两种情况下,b被初始化为一个已知值。我的问题很简单:在C++11或C++14规范中的什么地方记录了这种行为? 最佳答案 [atomics.t
std::shared_ptrhasspecializationsforatomicoperations像atomic_compare_exchange_weak和family,但我找不到关于std::unique_ptr的等效特化的文档。有没有?如果不是,为什么不呢? 最佳答案 可以提供std::shared_ptr的原子实例的原因并且不可能为std::unique_ptr这样做在他们的签名中暗示。比较:std::shared_ptr对比std::unique_ptr其中D是删除器的类型。std::shared_ptr需要分配一个
自然地,为了让典型的现代处理器架构(如x86_64)执行原子加载或存储,要读取/写入的数据需要对齐。但是这个要求实际上是如何通过C++11实现/强制执行的变量?假设我有一个支持16字节比较和交换(双字CAS)的体系结构,因此它可以自动读/写16字节值,并且我定义了一个16字节类型:structdouble_word{std::uint64_tx;std::uint64_ty;};现在,假设我包含一个std::atomic作为类的成员字段:classfoo{public:std::atomicdword;};我怎么知道foo::dword实际上是在16字节边界上对齐?我怎么知道有人调用d
在一个系统上:typedefunsignedcharuint8_t;typedefunsignedshortuint16_t;std::atomic::is_always_lock_free//=>falsestd::atomic::is_always_lock_free//=>true据我了解,类型std::atomic将是8位并且不是无锁的。如果是这样,如果我想要一个至少8位且始终无锁的原子类型,我应该怎么写?(假设存在这种类型)是否有比以下更好的选择:std::atomic::is_always_lock_free,uint8_t,uint16_t>::type>(为简单起见,我
我找不到基于锁和无锁原子之间的语义差异。据我所知,就语言而言,差异在语义上没有意义,因为该语言不提供任何时间保证。我能找到的唯一保证是内存排序保证,这两种情况似乎都相同。(如何)原子的无锁性会影响程序语义?即,除了调用is_lock_free或atomic_is_lock_free之外,是否有可能编写一个定义明确的程序,其行为实际上受到原子是否无锁的影响?这些功能甚至具有语义意义吗?或者它们只是用于编写响应式程序的实用hack,即使该语言从一开始就没有提供时间保证? 最佳答案 至少有一个语义差异。根据C++111.9程序执行/6:W