草庐IT

atomic_bool

全部标签

c++ - 为什么 std::atomic 中的所有成员函数都带有和不带有 volatile?

我注意到std::atomic的大多数成员函数类型被声明了两次,一次是用volatile修饰符,一次没有(example))。我检查了G++标准库实现的源代码,发现它们都是完全相同的,例如,boolload(memory_order__m=memory_order_seq_cst)constnoexcept{return_M_base.load(__m);}boolload(memory_order__m=memory_order_seq_cst)constvolatilenoexcept{return_M_base.load(__m);}我找不到任何volatile的例子变体的行为不

c++ - 运算符优先级(bool 之前是否为 void*?)

回答thisquestion时我做了一些让我很困惑的研究。我注意到两个成功打开的ifstreams不相等,但两个失败的ifstreams相等。起初我检查了cplusplus.com。operator!返回badbit和failbit的状态。我认为与此相反的仍然是返回这两位的状态,但是翻转了。错误,因为两次成功调用不相等。然后我认为它是某个地方的operatorbool会返回一些东西。所以我试图从ifstream回溯并找到istream::operatorbool(),它正在返回_Ok。但还是错了,这似乎根本没有被调用(也不可能,因为两次成功的调用仍然不相等)。所以我改变了方法并检查了V

c++ - 防止 std::atomic 溢出

我有一个原子计数器(std::atomiccount),它向多个线程处理顺序递增的值。uint32_tmy_val=++count;在我得到my_val之前我想确保增量不会溢出(即:回到0)if(count==std::numeric_limits::max())throwstd::runtime_error("countoverflow");我认为这是一个天真的检查,因为如果在递增计数器之前由两个线程执行检查,则第二个要递增的线程将返回0if(count==std::numeric_limits::max())//if2threadsexecutethisthrowstd::runt

c++ - boost::optional 对 bool 的隐式转换消失了吗?

我开始将vc++10/boost1.48代码库移植到vc++12/boost1.57,但我收到一个错误,提示boost::optional无法转换为bool。我以为这是boost::optional的一个特性,它被删除了吗?例子:boolfizz(){boost::optionalbuzz;returnbuzz;}给予Error21errorC2440:'return':cannotconvertfrom'boost::optional'to'bool' 最佳答案 是的。Boost1.55仍然使用SafeBoolIdiom://im

c++ - 重载、可变参数函数和 bool 类型

以下程序编译正常并按预期工作。它的输出是:12#includeclassFoo{public:voidBar(constchar*b,...){printf("1\n");};voidBar(inta,constchar*b,...){printf("2\n");};};intmain(){Foofoo1;foo1.Bar("Test","xx",1,2);foo1.Bar(1,"xx","xx",2,2);}现在,如果我将第二个Bar函数的int参数更改为bool和foo1.Bar(1,"xx","xx",2,2);到foo1.Bar(true,"xx","xx",2,2);,那么下

c++ - std::atomic<X>::value_type 发生了什么?

根据thisreferencemanualForeverystd::atomic(whetherornotspecialized),std::atomic::value_typeisX.但是如果我尝试使用这种类型,我会得到一个编译错误。我用g++8.2.1试过了:$g++-std=c++11test.cctest.cc:Infunction‘intmain()’:test.cc:6:23:error:‘value_type’isnotamemberof‘std::atomic’std::atomic::value_typex=0;还有clang6.0.1$clang-std=c++11

c++ - 使用 volatile bool 强制另一个线程等待是否安全? (C++)

我读到的关于volatile的所有内容都说它永远不安全,但我仍然倾向于尝试它,而且我还没有看到这种特定情况被宣布为不安全。我有一个单独的线程来渲染场景,从主模拟线程中提取数据。这没有同步,但工作正常。问题在于,当程序退出时,渲染器需要停止从模拟线程中提取数据,然后模拟线程才能安全地清理自身,而不会导致渲染器尝试读取无效内存。为此,我让渲染器在其线程中无限运行:volatileboolstillRendering;voidRenderThreadFunction(){stillRendering=true;while(programRunning){renderer->render();

c++ - 如何 memset 一个 bool 数组?

void*memset(void*dest,intc,size_tcount)第三个参数是数组中的字符数或字节数。你如何memset一个bool数组,比如boolbArray[11]?MSDN说:“安全说明-确保目标缓冲区有足够的空间容纳至少count个字符。” 最佳答案 std::fill()应尽可能使用memset()。std::fill(std::begin(bArray),std::end(bArray),value);如果bArray是指针,则应使用以下内容:std::fill(bArray,bArray+arraySiz

c++ - 我可以在 C++ 中获得非专用 vector<bool> 类型吗?

Avector专门用于减少空间消耗(每个元素1位),但访问速度比vector慢.有时我使用vector出于性能原因,但如果我转换char到bool,我的编译器(VisualC++)可能会生成一个C4800我不喜欢的警告。此外,我认为vector如果我将其视为未专门化的vector,则在语义上是错误的.那么,我能得到一个真正的非专业vector吗?键入C++? 最佳答案 不,你不能得到一个非特化的std::vector.vector是你最好的选择,因为你已经知道了。要绕过警告,只需使用bool表达式:boolb1=v[0]!=0;bo

c++ - 两个 std::atomic 可以成为一个 union 的一部分吗?

我想这样做:union{std::atomicu128;struct{std::atomicu64_1;std::atomicu64_2;};};多个线程将读取和写入union的两个部分。安全吗?编辑:我使用Linux,x86_64,clang3.3Edit2:我希望能够递增和递减u64_1,读取u64_2,并写入u128(compare_exchange)Edit3:如果我使用atomicbuiltinfunctions会怎么样??union将如下所示:union{uint128_tu128;struct{uint64_tu64_1;uint64_tu64_2;};};u64_1将映