这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Concurrency:AtomicandvolatileinC++11memorymodel使用C++11规范,是否有新鲜度保证?不同内存顺序的描述只涉及重新排序(据我所知)。具体来说,在这种情况下:#includestd::atomiccancel_work(0);//Thread1isexecutingthisfunctionvoidthread1_func(){...while(cancel_work.load()==0){...dowork...}}//Thread2executesthisfunct
C++11对atomicvariables有一个“比较和交换”操作.语义是:Atomicallycomparesthevaluepointedtobyobjwiththevaluepointedtobyexpected,andifthoseareequal,replacestheformerwithdesired(performsread-modify-writeoperation).Otherwise,loadstheactualvaluepointedtobyobjinto*expected(performsloadoperation).我想做同样的事情,但不是在值相等时设置*ob
我对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 最佳答案
使用限定符-volatile来创建原子对象是否有意义?使用那个:volatilestd::atomici(1);代替:std::atomici(1); 最佳答案 不,让std::atomic也具有易变性是绝对没有意义的,因为在std::atomic内部,代码将处理以下可能性变量可能随时更改,并且可能需要“告知”其他处理器它已更改(volatile未涵盖“告知”其他处理器)。你真正需要volatile的唯一时间是你有一个指向你的代码控制的硬件的指针-例如读取定时器中的计数器,或者哪个帧缓冲区是事件的现在,或者告诉网卡从哪里读取下一个要
下面两段代码是否相同:std::atomic_flaglock=ATOMIC_FLAG_INIT;和std::atomic_flaglock;lock.clear();似乎第二个可以允许点击几下锁定处于未知状态第一个代码片段是否始终具有已知状态? 最佳答案 ATOMIC_FLAG_INIT是一个实现定义的宏,保证可以像您发布的那样在表达式中工作。例如,它可以方便地初始化您可能在命名空间范围内定义的atomic_flag。它还保证标志将被清除,并且如果标志本身具有静态存储持续时间,则初始化也将是静态的。第二组语句是初始化,然后清除标志
用这样的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更酷,而且你看
我目前正在尝试学习如何使用OpenMP,但我有一个问题。这样做安全吗:std::atomicresult;#pragmaompparallelforfor(...){result+=//somestuff;}或者我应该使用:doubleresult;#pragmaompparallelforfor(...){doubletmp=0;//somestuff;#pragmaompatomicresult+=tmp;}谢谢!编辑:我知道最简单的处理方法是使用数组,但我问是因为我很好奇 最佳答案 官方说法,没有。在实践中,可能。OpenMP
使用relaxedmemoryorder,例如对于引用计数指针,是否允许编译器优化掉后续的递增和递减?std::atomic_int32_tai;for(size_ti=0;i看看反汇编,它看起来不像。但由于允许重新排序,并且atomic的行为就像一个计数器,只是线程安全的,有人可能会争辩说他可以优化,就好像它是一个普通的int。 最佳答案 我相信它可以优化,除非声明为volatile。原因是对于任何在其间交错一些线程的调度,存在不存在的有效调度。我相信drf-sc内存模型也是如此。如果此线程读取介于两者之间的内容,情况就不会如此。
在http://en.cppreference.com/w/cpp/atomic/atomic_compare_exchange,以下示例代码作为std::atomic_compare_exchange_weak的示例使用:voidappend(list*s,node*n){node*head;do{head=s->head;n->next=head;}while(!std::atomic_compare_exchange_weak(s->head,head,n));}我的理解是这个有比较*(s->head)的效果与head,当我认为需要的是比较s->head与head.第一个参数应该
我正在为引用计数器(如this)使用std::atomic实现指针/弱指针机制。为了将弱指针转换为强指针,我需要以原子方式进行检查强引用计数器是否非零如果是,增加它了解是否发生了变化。有没有办法使用std::atomic_int来做到这一点?我认为必须使用compare_exchange之一,但我想不通。 最佳答案 给定定义std::atomicref_count;intprevious=ref_count.load();for(;;){if(previous==0)break;if(ref_count.compare_exchan