草庐IT

atomic_fetch_add

全部标签

C++11:atomic<T>::store 和 atomic_store<T> 之间有什么区别

一个是模板类std::atomic的成员函数,一个是模板函数,看起来他们做的是同一件事。既然std是一个类库,为什么它同时提供类和非类版本,我认为是一样的操作?它们之间有什么真正的区别吗? 最佳答案 语义上没有区别。免费功能是为了实现与C11的源代码兼容性的尝试:#ifdef__cplusplus#include#define_Atomic(X)std::atomic#else#include#endif_Atomic(int)c;intget_c(void){returnatomic_load(&c);}

c++ - C++ 11 中使用 Atomic 的连续、不同的序列

我有两个关于原子的问题:1)以下代码是否保证在多线程设置中返回连续的、单调递增的序列而不重复?#includestructAtomicCounter{std::atomicvalue;AtomicCounter():value(0){}intgetNextSequence(){return++value;}};2)有没有更简单的初始化方法?这些都不起作用:std::atomicvalue(0);std::atomicvalue{0};std::atomicvalue=0;提前致谢 最佳答案 是的,您将获得一个没有间隙或重复的序列,即

c++ - std::atomic 如何保证原子性

如果我有密码a=a+1,现在我明白执行此操作需要多个CPU级别的操作,但是如何定义a作为std::atomic使这些多个事务成为原子?它是否改变了CPU指令的执行方式。我假设它必须以某种方式将指令数减少到1,这样任何上下文切换都不会导致不可靠的结果,但它是如何做到的呢?如果编译器总是可以创建这样的代码,为什么不总是这样做呢? 最佳答案 如果有原子指令可以发出(对于已知可能的原子操作),则发出这条原子指令,否则会带锁机制。有一个函数(C++17)可以告诉您原子类型是否始终是无锁的:is_always_lock_free.请注意,如果此

c++ - 如果 `atomic<T>` 是无锁的并且大小与 `T` 相同,内存布局是否相同?

Thisquestionhere表示std::atomic通常应该与T具有相同的大小,而对于x86、x64和ARM上的gcc、clang和msvc,情况确实如此。在std::atomic的实现中对于某些类型总是无锁T,它的内存布局是否保证与T的内存布局相同??std::atomic是否有任何额外的特殊要求?,比如对齐? 最佳答案 在查看[atomics.types.generic]时,您链接的答案部分引用了该答案,关于对齐的唯一评论是您之前看到的注释:Note:Therepresentationofanatomicspecializ

c++ - add 的位运算

你能帮我弄清楚为什么以下表达式为真:x+y=x^y+(x&y)我正在从按位逻辑中寻找一些规则来解释这个数学等价物。 最佳答案 这就像解决一个普通的以10为底的加法问题955+445,首先将所有列单独相加并丢弃带进位的1:955445-----390然后找到应该有进位1的所有列:955445-----101将其移动并将其添加到原始结果中:390+1010------1400所以基本上您是在做加法,但忽略所有进位的1,然后作为一个单独的步骤在后面添加进位的。在基数2中,当任一位为0时,XOR(^)正确执行加法。当两位都为1时,它会执行不

c++ - atomic<T*> 总是无锁的吗?

在我的MAC操作系统上,atomic是无锁的。#include#includeintmain(){std::cout().is_lock_free()我想知道是否atomic总是无锁?有引用介绍吗? 最佳答案 Thestandardallowsimplementinganyatomictype(withexceptionofstd::atomic_flag)tobeimplementedwithlocks.即使平台允许某些类型的无锁原子,标准库开发人员也可能没有实现它。如果您需要在使用锁时实现不同的东西,可以在编译时使用ATOMIC

c++ - 使用已删除函数 - std::atomic

这是我在.h文件中的声明:staticstd::atomicOrdersExecutorIdCounter;这是来自.cpp文件的初始化:std::atomicActionBasedOrdersExecutor::OrdersExecutorIdCounter=0;它在VC++中编译得很好,但在gcc4.8中我得到这个错误:error:useofdeletedfunction‘std::atomic::atomic(conststd::atomic&)’我该如何解决这个问题? 最佳答案 可以直接初始化原子变量,不需要deleted拷

c++ - 对 std::atomic::load 的结果使用 Structure dereference(->) 运算符是否安全

在尝试使用std原子指针时,我遇到了以下问题。假设我这样做:std::atomicmyString;////AcanIdothis?myString.load()->size()//BcanIdothis?charmyFifthChar=*(myString.load()->c_str()+5);//CcanIdothis?charmyCharArray[255];strcpy(myCharArray,myString.load()->c_str());我很确定C是非法的,因为myString可能同时被删除。但是我不确定A和B。我认为它们是非法的,因为在执行读取操作时指针可能会被引用。

c++ - 尝试使用 std::add_const 将 T& 转换为 const T&

我有一个T&,它有一个函数的const和非常量版本。我想调用该函数的const版本。我尝试使用std::add_const将T&转换为constT&但它不起作用。我做错了什么,我该如何解决?这是一个简单的例子。voidf(int&){std::cout::type>(r));}输出:int& 最佳答案 类型特征是解决这个问题的一种非常费力的方法。只需使用模板类型推导:voidf(int&){std::coutconstT&make_const(T&t){returnt;}intmain(){inta=0;int&r=a;f(make

c++ - std::atomic_store 和 std::atomic_exchange 不交换

根据en.cppreference.com,std::atomic_exchange和std::atomic_store等价于线程安全的std::swap。但这不是我使用g++或clang++得到的行为。Problemliveoncoliru.(见下文)它虽然打印了这个:std::atomic_storea:0x1ed2c300b:0x1ed2c501a:0x1ed2c501b:0x1ed2c501std::atomic_exchangea:0x1ed2c500b:0x1ed2c301a:0x1ed2c301b:0x1ed2c301这是为什么?难道我做错了什么?我是否误读了文档?代码l