草庐IT

atomic-values

全部标签

c++ - 如何正确增加 C++11 std::atomic?

我是多线程编程的新手,我发现了C++11中的std::atomic。所以,我试图弄清楚原子操作需要多少时间。我试过这段代码:usingnamespacestd;usingnamespacestd::chrono;constexprintNUM_THREADS=8;constexprintLIMIT=100000;atomicsum=0;voidfoo(intidx){while(true){if(sum.load()>=LIMIT){return;}sum.fetch_add(1);}}与主要:intmain(void){threadthreads[NUM_THREADS];autos

c++ - std::atomic 用于内置类型 - 非无锁与琐碎的析构函数?

查看std::atomic这是我阅读的默认专业:Thesespecializationshavestandardlayout,trivialdefaultconstructors,andtrivialdestructors.我还阅读了is_lock_free:Allatomictypesexceptforstd::atomic_flagmaybeimplementedusingmutexesorotherlockingoperations,ratherthanusingthelock-freeatomicCPUinstructions.Atomictypesarealsoallowed

C++ 在 ‘value_type’ 中没有名为 ‘struct std::iterator_traits<int>' 的类型

你好。我正在尝试运行以下代码(仅用于培训目的):#include#includetemplate>classkont>typenamestd::iterator_traits::value_typefoo_test(typenamekont::iteratorb){return*b;}templatetypenamestd::iterator_traits::value_typeminimum(Iterb,Itere){Iterm=b;/*CODE*/return*m;}intmain(void){std::listx;x.push_back(10);x.push_back(100);

c++ - std::atomic::compare_exchange 与两个 memory_order 参数一起使用的真实示例

您能否给出一个真实世界的例子,其中出于某种原因使用了std::atomic::compare_exchange的两个memory_order参数版本(因此一个memory_order参数版本是不够的)? 最佳答案 在许多情况下,compare_exchange上的第二个内存排序参数设置为memory_order_relaxed。在这些情况下,省略它通常并没有错,只是可能效率较低。这里是一个简单的无锁列表/堆栈示例,它需要compare_exchange_weak上的第二个不同的排序参数,以便避免数据竞争。调用push可以并发执行,但

c++ - 为什么 std atomic 将 5 插入堆栈

我想看看std::atomic是如何被翻译成汇编的。为此,我编写了以下代码,但有些地方我不明白。以下代码:intmain(void){std::atomica;a.fetch_add(0);return0;}由GCC编译为:1|pushrbp2|movrbp,rsp3|movDWORDPTR[rbp-4],04|movDWORDPTR[rbp-8],55|movedx,DWORDPTR[rbp-4]6|learax,[rbp-12]7|lockxaddDWORDPTR[rax],edx8|moveax,09|poprbp10|ret为什么GCC将“5”(第4行)压入堆栈?

c++ - 多个 std::atomic<T> 条件

在我的多线程应用程序中,我有一个可以简化为这个例子的条件std::atomica,b;//...if(a.load()&&b.load()){//...}显然,在条件之后,a和b可以持有不同的值。在我的应用程序中,它认为,如果两个值同时为真,它们就不能再改变状态。但是在a.load()返回true之后,它可能甚至在b.load()被评估之前改变它的值。是否有一个优雅的解决方案来原子地评估这个声明?显然,锁定a.store(..)和b.store(..)的每次调用都可以在这里工作,但这远非好事。 最佳答案 您是否考虑过使用atomic

c++ - std::map<key_type, value_type>::find(different_key_type)

我有一张map:std::mapmyMap;但是,在某些情况下,我想通过比较TyString==TyStringRef来std::map::find一个条目,即myMap.find(TyStringRef("MyString"));原因是TyString包装了一个它自己分配和释放的constchar*。但是,为了只找到一个条目,我不喜欢分配一个新的字符串,而是我只想使用引用(TyStringRef只包装一个constchar*而不分配或释放内存)。当然,我可以将TyStringRef转换为TyString,但这样我就有了上述的内存开销。有解决这个问题的智能方法吗?谢谢!

c++ - 错误 : Element <EnableEnhancedInstructionSet> has an invalid value of "NoExtensions"

我想在虚拟机WindowsXP下VS2010下打开别人的C++项目。问题是,我认为该项目似乎是在Windows7下的VS2012下开发的。我已经成功转换了它的相关配置,感谢互联网。但是现在,当我尝试构建这个项目时,出现了以下错误:C:\ProgramFiles\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5):error:Elementhasaninvalidvalueof"NoExtensions".似乎配置更改导致了这个问题。我所做的是将Project->Properties-

c++ - 没有匹配的成员函数来调用 child.value

当我尝试编译下面的代码时出现错误:src/main.cpp:51:48:error:nomatchingmemberfunctionforcallto'child_value'std::cout我不明白的是我能够在上面的循环中使用它。我只能假设它希望我使用kv.second.child_value(kv.second);代替。但是我希望它在for(auto&eb:mapb){.返回的xml上运行这段代码。#include"pugi/pugixml.hpp"#include#include#includeintmain(){conststd::maptagMap{{"descriptio

c++ - "warning C4800: ' int' : forcing value to bool 'true' or 'false' "不同场景下的不同行为

我无法理解此警告的以下行为。case1:boolread=(33&3);//NoWarningissuedbyvs2013case2:intb=33;boolread=(b&3);//NowcompilerisgeneratingC4800warning.为什么编译器在情况2中生成警告,而在情况1中不发出任何警告。 最佳答案 C4800是一个性能警告-在运行时将整数强制转换为bool会产生成本。这与逻辑正确性无关。最常见的强制转换(和警告)发生在您与使用整数(VC++中的BOOL)作为bool值的代码交互时。第一个代码段中的编译时强