草庐IT

Atomic类

全部标签

c++ - atomic_thread_fence(memory_order_seq_cst)是否具有完整内存屏障的语义?

完全/通用内存屏障是指相对于系统其他组件而言,屏障之前指定的所有LOAD和STORE操作似乎都发生在屏障之后指定的所有LOAD和STORE操作之前的情形。根据cppreference,memory_order_seq_cst等于memory_order_acq_rel加上在这样标记的所有操作上的单个总修改顺序。但是据我所知,C++11中的获取或释放围栏都不会强制执行#StoreLoad(存储后加载)排序。释放栅栏要求任何后续的写操作都不能对先前的读/写进行重新排序;获取栅栏要求后续的读/写操作不能与先前的任何读操作重新排序。如果我错了,请纠正我;)举个例子atomicx;atomicy

c++ - 条件语句与 std::atomic<T> 的基本用法

所以我开始熟悉C++11类型。过去,当我有一个原子标志时,我通常会在访问它之前简单地锁定一个互斥体。一个常见的需求是检查标志是否为false,如果是,则自动将其设置为true然后做点什么。所以基本上这会像这样完成,其中flag是一个简单的bool:{std::lock_guardlock(my_mutex);if(!flag){flag=true;//dosomething;}}所以,现在我正试图弄清楚如何使用完成同样的事情。.docs假设赋值运算符和operatorT原子类型的是原子操作。但是,如果我更改flag至std::atomic,我想我不能简单地说:if(!flag){fla

c++ - 实现 atomic<T>::store

我正在尝试实现C++0x草案中的原子库。具体来说,我正在实现§29.6/8,store方法:templatevoidatomic::store(TpDesired,memory_orderpOrder=memory_order_seq_cst);要求说明:Theorderargumentshallnotbememory_order_consume,memory_order_acquire,normemory_order_acq_rel.如果是其中之一,我不确定该怎么办。我应该什么都不做、抛出异常、出现未定义的行为,还是做其他事情?附言:“C++0X”看起来有点像死鱼:3

c++ - std::atomic load 中的段错误?

在linux上,使用gcc4.8.4,使用-std=c++11-mcx16编译:#includestructnode_t;structpointer_t{node_t*ptr;unsignedintcount;pointer_t()noexcept:ptr{nullptr},count{0}{}};structempty{};structnode_t{emptyvalue;std::atomicnext;node_t():next{pointer_t{}}{}};intmain(){node_t{}.next.load();return0;}在调用load时给出段错误。我该如何初始化原

c++ - 什么 C++11 <atomic> 操作/内存顺序保证新鲜度?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Concurrency:AtomicandvolatileinC++11memorymodel使用C++11规范,是否有新鲜度保证?不同内存顺序的描述只涉及重新排序(据我所知)。具体来说,在这种情况下:#includestd::atomiccancel_work(0);//Thread1isexecutingthisfunctionvoidthread1_func(){...while(cancel_work.load()==0){...dowork...}}//Thread2executesthisfunct

c++ - atomic_compare_exchange 大于而不是等于?

C++11对atomicvariables有一个“比较和交换”操作.语义是:Atomicallycomparesthevaluepointedtobyobjwiththevaluepointedtobyexpected,andifthoseareequal,replacestheformerwithdesired(performsread-modify-writeoperation).Otherwise,loadstheactualvaluepointedtobyobjinto*expected(performsloadoperation).我想做同样的事情,但不是在值相等时设置*ob

c++ - OpenMP 和#pragma omp atomic

我对OpenMP有疑问。MSVS编译器向我抛出“pragmaompatomic的形式不正确”。我不知道为什么。代码:(程序用积分法指定PI号)#include#include#includelonglongnum_steps=1000000000;doublestep;intmain(intargc,char*argv[]){clock_tstart,stop;doublex,pi,sum=0.0;inti;step=1./(double)num_steps;start=clock();#pragmaompparallelforfor(i=0;i 最佳答案

c++ - 使 std::atomic<> 对象具有限定符 - volatile 是否有意义?

使用限定符-volatile来创建原子对象是否有意义?使用那个:volatilestd::atomici(1);代替:std::atomici(1); 最佳答案 不,让std::atomic也具有易变性是绝对没有意义的,因为在std::atomic内部,代码将处理以下可能性变量可能随时更改,并且可能需要“告知”其他处理器它已更改(volatile未涵盖“告知”其他处理器)。你真正需要volatile的唯一时间是你有一个指向你的代码控制的硬件的指针-例如读取定时器中的计数器,或者哪个帧缓冲区是事件的现在,或者告诉网卡从哪里读取下一个要

c++ - 使用 ATOMIC_FLAG_INIT 和 std::atomic_flag::clear 有什么区别

下面两段代码是否相同:std::atomic_flaglock=ATOMIC_FLAG_INIT;和std::atomic_flaglock;lock.clear();似乎第二个可以允许点击几下锁定处于未知状态第一个代码片段是否始终具有已知状态? 最佳答案 ATOMIC_FLAG_INIT是一个实现定义的宏,保证可以像您发布的那样在表达式中工作。例如,它可以方便地初始化您可能在命名空间范围内定义的atomic_flag。它还保证标志将被清除,并且如果标志本身具有静态存储持续时间,则初始化也将是静态的。第二组语句是初始化,然后清除标志

c++ - atomic_compare_exchange 与互斥锁

用这样的block替换互斥锁有什么意义voidstack_push(stack*s,node*n){node*head;do{head=s->head;n->next=head;}while(!atomic_compare_exchange(s->head,head,n));}不明白用这个原子交换替换互斥量我们能得到什么好处? 最佳答案 有很多优点;速度很多(在Windows上,比如10倍或100倍-在Linux上没那么快,比如10%好)它可以更好地扩展MUCH(尽管仍然不够-只能扩展到大约100个逻辑核心)它MUCH更酷,而且你看