草庐IT

c++ - std::atomic 将一对原子 int32 视为一个原子 int64?

我有一对unsignedint32std::atomic_start;std::atomic_end;有时我想通过比较交换来设置开始或结束,所以我不希望在整个64位对上使用CAS可能导致虚假故障。我只想使用32位CAS。_end.compare_exchange_strong(old_end,new_end);现在我可以将开始和结束作为一个64位原子读取来获取。或者两个单独的32位读取。执行一次64位原子提取(编译器添加适当的内存栅栏)而不是使用两个内存栅栏进行两次单独的32原子位读取(或者编译器会优化它吗?)会不会更快?如果是这样,我将如何在C++11中做到这一点?

c++ - Clang++ Xcode 4.4 非静态成员初始化和移动构造函数

我正在使用Xcode4.4和mountainlion。我似乎无法理解为什么模板中的非静态成员初始化会调用变量的移动构造函数。无论如何要克服这个错误?示例代码:#include#include////Thisclasscancompile//classWorking{public:intGetValue(){returnvalue_;}private:std::atomicvalue_{0};};////Thisclasscannotcompile//templateclassNotWorking{public:intGetValue(){returnvalue_;}private:st

c++ - 扭曲如何与原子操作一起工作?

warp中的线程在物理上并行运行,所以如果其中一个(称为线程X)启动原子操作,其他线程会做什么?等待?这是否意味着,当线程X被推送到原子队列时,所有线程都将等待,获取访问权限(互斥锁)并使用内存做一些事情,内存受到该互斥锁的保护,然后才是真正的互斥锁?有没有办法让其他线程进行某些工作,比如读取一些内存,这样原子操作会隐藏它的延迟?我的意思是,有15个空闲线程......我猜不太好。Atomic真的很慢,是吗?我怎样才能加速它?有什么模式可以使用它吗?共享内存的原子操作是否锁定银行或整个内存?例如(没有互斥量),有__shared__floatsmem[256];线程1运行atomicA

C++ 原子数组是否也需要是原子的?

我有一些代码如下:KMessageQueue::KMessageQueue(){messages=newatomic[MAX_MESSAGES];for(inti=0;i其中messages是KMessageQueue的成员,定义为:std::atomic*messages;所以消息数组中的每个元素都是原子的,我从另一个线程读取它们。但是数组指针本身也需要是原子的吗?另一个线程会不会在构造函数完成后尝试访问消息,却发现消息还没有被赋值? 最佳答案 Butdoesthearraypointeritselfalsoneedtobeato

c++ - std::atomic::load 的内存排序行为

我是否错误地假设atomic::load也应该充当内存屏障以确保所有先前的非原子写入将对其他线程可见?举例说明:volatileboolarm1=false;std::atomic_boolarm2=false;booltriggered=false;线程1:arm1=true;//std::std::atomic_thread_fence(std::memory_order_seq_cst);//thiswoulddothetrickif(arm2.load())triggered=true;线程2:arm2.store(true);if(arm1)triggered=true;我预

C++ 原子列表容器

我正在研究std::atomic但我认为我没有完全理解这个概念。我想知道为什么没有原子容器。所以我玩了一下。首先,我尝试了以下操作:std::atomic>atomicList;但是正如其他一些人已经指出的那样,这是行不通的,因为构造函数是noexcept。所以我创建了一些hack:templateclassMyList{public://MakesurethatnoexceptionisthrownMyList()noexcepttry:l(){}catch(...){}voidpush_back(constT&t){l.push_back(t);}voidpop_front(){l

C++11 原子类和操作——我说得对吗

我的以下假设是否正确:我不需要显式同步对std::atomic的访问来自任何平台上不同线程的对象与我自己的同步对象std::atomic操作可以是无锁的或非无锁的,具体取决于平台std::atomic_bool和std::atomic(以及其他类似的类型)实际上是相同的东西std::atomic_flag是唯一按照标准保证平台无关的无锁操作的类另外,我在哪里可以找到有关std::memory_order的有用信息?以及如何正确使用它? 最佳答案 让我们一一过一遍。我不需要显式同步对std::atomic的访问来自任何平台上不同线程的

C++11 具有非原子变量的原子内存顺序

我不确定c++11中原子变量的内存排序保证如何影响对其他内存的操作。假设我有一个线程定期调用写入函数来更新值,另一个线程调用读取函数来获取当前值。是否保证d=value;的效果不会在a=version;的效果之前看到,而会在b=的效果之前看到版本;?atomica{0};atomicb{0};doubled;voidwrite(intversion,doublevalue){a=version;d=value;b=version;}doubleread(){intx,y;doubleret;do{x=b;ret=d;y=a;}while(x!=y);returnret;}

c++ - 原子变量的多重赋值是原子操作吗?

假设我有两个原子bool值,如下所示。private:std::atomic_boolx;std::atomic_booly;我可以说下面的操作是原子的吗?还是我必须使用lock_guard以确保它们被分配在一起?x=y=true;//aretwoboolsassignedtogetheratomically?还考虑在另一个线程中我想读取这些bool值。if(!x&&!y)...我的假设是这不是原子的,也许使用atomic会更好相反? 最佳答案 不,不是。原子操作所保证的只是变量上不会发生任何干预操作。在您的示例中,完全有可能y被分

c++ - fetch_add with acq_rel 内存顺序

考虑一个std::atomicx(0);假设我有一个函数执行以下操作:intx_old=x.fetch_add(1,std::memory_order_acq_rel);基于descriptionforacquirereleasememoryordering:memory_order_relaxedRelaxedoperation:therearenosynchronizationororderingconstraints,onlyatomicityisrequiredofthisoperation(seeRelaxedorderingbelow)memory_order_consum