草庐IT

volatile-qualifier

全部标签

C++0x |为什么 std::atomic 使用 volatile-qualifier 重载每个方法?

当前草案的以下摘录说明了我的意思:namespacestd{typedefstructatomic_bool{boolis_lock_free()constvolatile;boolis_lock_free()const;voidstore(bool,memory_order=memory_order_seq_cst)volatile;voidstore(bool,memory_order=memory_order_seq_cst);boolload(memory_order=memory_order_seq_cst)constvolatile;boolload(memory_orde

c++ - VS2012中使用 'volatile'关键字的最佳实践

自从将我们的开发和构建环境从VS2008升级到VS2012后,我对使用volatile的含义感到困惑。我们遗留代码库中的关键字(它非常广泛,因为有很多复制的模式用于管理“旧”时代的线程)。微软在VS2012文档中有如下注释:IfyouarefamiliarwiththeC#volatilekeyword,orfamiliarwiththebehaviorofvolatileinearlierversionsofVisualC++,beawarethattheC++11ISOStandardvolatilekeywordisdifferentandissupportedinVisualS

c++ - `volatile` 在线程之间同步变量

我有一个从两个线程访问的变量intfoo。假设我没有竞争条件问题(访问受互斥锁保护,所有操作都是原子的,或任何其他防止竞争条件的方法),仍然存在“寄存器缓存”问题(因为缺少更好的名称),其中编译器可能假设如果变量被读取两次而不在其间写入,则它是相同的值,因此可能会“优化”掉以下内容:while(foo){//或if(foo)//becomessomethinglike(myassemblyisveryrusty):movebx,[foo];cmpebx,0;jzlabel;do-something-that-doesn't-involve-foo;do-something-else-t

c++ - 为什么这个volatile变量的地址一直是1?

我想检查我的变量的地址volatileintclock;cout但它总是说x在地址1。我做错了什么吗?? 最佳答案 iostreams会将大多数指针转换为void*以供显示-但volatile指针不存在转换。因此,C++回退到对bool的隐式转换。如果要打印地址,请显式转换为void*:std::cout 关于c++-为什么这个volatile变量的地址一直是1?,我们在StackOverflow上找到一个类似的问题: https://stackoverflo

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++ - Visual C++ volatile

VisualC++中“volatile”的MSDN文档指出写入具有“释放语义”,读取具有“获取语义”,此外还要确保读取始终从内存中读取并且写入始终相应地写入。“volatile”的C规范包括第二部分(不要做疯狂的优化),但不包括第一部分(内存栅栏)。在没有内存栅栏的情况下,VisualC++中是否有任何方法可以仅获得“C”volatile行为?我想强制变量始终位于堆栈中的固定位置,但我不想在每次赋值时都占用内存栅栏的开销。有没有使用VisualC++源代码的简单方法? 最佳答案 IsthereanywayinVisualC++tog

c++ - gcc 的 asm volatile 是否等同于递归的 gfortran 默认设置?

我只是在研究C++和Fortran中的递归函数,我意识到Fortran中的一个简单递归函数几乎是与其等效的C++函数一样快。现在,在进入这个之前,我知道这里有类似的问题,特别是:Whydoesaddingassemblycommentscausesuchradicalchangeingeneratedcode?Workingofasmvolatile(“”:::“memory”)Equivalenttoasmvolatileingfortran但是,我有一点更具体和困惑,因为Fortran编译器似乎正在做你可以用gcc中的asmvolatile实现的事情。为了给您一些上下文,让我们考虑

c++ - volatile 成员函数 (C++)

给定以下类:classMyClass{public:intvalue()const{returnvalue_;}private:volatileintvalue_;};是否还必须将value()成员函数标记为volatile以避免被优化掉,或者是否可以按照编写的那样进行?谢谢。 最佳答案 它完全类似于const的工作方式。如果你有一个const对象,只有标记为const的成员函数是可调用的。所以...如果你有一个volatile对象,只有标记为volatile的成员函数是可调用的。只要对象本身不是volatile,函数是否是都没有区

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

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

c++ - 接受所有版本的 const/volatile 限定和 & vs && 的类模板特化

我专攻std::common_type适合我的类型。我定义了以下专业:common_type一切都很好。然后有人过来调用std::common_type.如果您传递引用与不传递引用(因为它在类型上调用std::decay),则默认版本的行为相同。但是,它并不遵循std::common_type的非引用版本,我需要它才能正常工作。有没有比必须做这样的事情更好的方法(为简单起见,省略对const的右值引用):common_typecommon_typecommon_typecommon_typecommon_typecommon_typecommon_typecommon_typecomm