草庐IT

Atomic类

全部标签

c++ - std::atomic 可以安全地与 OpenMP 一起使用吗

我目前正在尝试学习如何使用OpenMP,但我有一个问题。这样做安全吗:std::atomicresult;#pragmaompparallelforfor(...){result+=//somestuff;}或者我应该使用:doubleresult;#pragmaompparallelforfor(...){doubletmp=0;//somestuff;#pragmaompatomicresult+=tmp;}谢谢!编辑:我知道最简单的处理方法是使用数组,但我问是因为我很好奇 最佳答案 官方说法,没有。在实践中,可能。OpenMP

c++ - std::atomic 可以用减量抵消增量吗?

使用relaxedmemoryorder,例如对于引用计数指针,是否允许编译器优化掉后续的递增和递减?std::atomic_int32_tai;for(size_ti=0;i看看反汇编,它看起来不像。但由于允许重新排序,并且atomic的行为就像一个计数器,只是线程安全的,有人可能会争辩说他可以优化,就好像它是一个普通的int。 最佳答案 我相信它可以优化,除非声明为volatile。原因是对于任何在其间交错一些线程的调度,存在不存在的有效调度。我相信drf-sc内存模型也是如此。如果此线程读取介于两者之间的内容,情况就不会如此。

c++ - cppreference 中 atomic_compare_exchange_weak 的示例代码是否正确?

在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.第一个参数应该

C++ 递增 std::atomic_int 如果非零

我正在为引用计数器(如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

C++ 11 未定义对 `__atomic_store_16' 的引用

这个问题在这里已经有了答案:is_lock_freenotdefinedinstd::atomicingcc4.7.2?(1个回答)关闭8年前。以下代码链接失败:#includestructA{unsignedlonga;unsignedlongb;};structB{voidset(Atmp){_a.store(tmp);}std::atomic_a;};intmain(){Bb;b.set(A());return0;}出现以下错误:/tmp/cc8gyaZM.o:Infunction`std::atomic::store(A,std::memory_order)':dryn.cpp

c++ - 为什么在通知 condition_variable 之前需要获取锁来修改共享的 "atomic"变量

这个问题在这里已经有了答案:Whyistherenowaitfunctionforcondition_variablewhichdoesnotrelockthemutex(1个回答)关闭7个月前。根据cppreference.com:Thethreadthatintendstomodifythevariablehastoacquireastd::mutex(typicallyviastd::lock_guard)performthemodificationwhilethelockisheldexecutenotify_oneornotify_allonthestd::condition

C++ 为什么atomic_load的参数类型是指针而不是引用?

我同意Whentousereferencesvs.pointers中的答案.但是,我想知道为什么C++将atomic_load定义为templateTatomic_load(conststd::atomic*obj)noexcept;^代替templateTatomic_load(conststd::atomic&obj)noexcept;^谁能帮帮我? 最佳答案 我们拥有这些免费函数模板的原因是与C11的源代码兼容性:#ifdef__cplusplus#include#define_Atomic(X)std::atomic#els

c++ - 将 std::condition_variable 与 atomic<bool> 一起使用

有几个关于SO处理原子的问题,以及其他处理std::condition_variable的问题。但是我的问题是我下面的用法是否正确?三个线程,一个ctrl线程在取消暂停其他两个线程之前做准备工作。当工作线程(发送者/接收者)处于紧密的发送/接收循环中时,ctrl线程还能够暂停它们。使用atomic的想法是在未设置暂停bool值的情况下使紧密循环更快。classSomeClass{public://...//Disregardthatdataispublic...std::condition_variablecv;//UDPthreadswillwaitonthiscvuntilallo

c++ - 如果已经被互斥锁保护,我是否需要使用 atomic<>

给定thispost中的代码,实现Semaphore仅使用atomic和mutex.我很好奇自count已经被updateMutex守护,是atomic有必要吗?structSemaphore{intsize;atomiccount;mutexupdateMutex;Semaphore(intn):size(n){count.store(0);}voidaquire(){while(1){while(count>=size){}updateMutex.lock();if(count>=size){updateMutex.unlock();continue;}++count;update

c++ - 如何打印 std::atomic<unsigned int> 的值?

我正在使用std::atomic在我的程序中。如何使用printf打印它的值?如果我只使用%u是行不通的.我知道我可以使用std::cout,但我的程序中到处都是printf电话,我不想更换他们中的每一个。以前我用的是unsignedint而不是std::atomic,所以我只是使用%u在我的printf中的格式字符串中调用,因此打印工作正常。尝试打印std::atomic时遇到的错误现在代替常规unsignedint是:error:format‘%u’expectsargumentoftype‘unsignedint’,butargument2hastype‘std::atomic’