草庐IT

non-volatile

全部标签

c# - volatile 用法的可重现示例

我正在寻找一个可以演示volatile关键字如何工作的可重现示例。我正在寻找在没有标记为volatile的变量的情况下“错误”工作并且“正确”工作的东西。我的意思是一些示例,该示例将证明执行期间的写入/读取操作顺序与变量未标记为volatile时的预期不同,并且在变量未标记为volatile时也没有不同。我以为我得到了一个例子,但后来在其他人的帮助下我意识到它只是一段错误的多线程代码。WhyvolatileandMemoryBarrierdonotpreventoperationsreordering?我还找到了一个链接,该链接演示了volatile对优化器的影响,但它与我正在寻找的不

c# - "a field initializer cannot reference non static fields"在 C# 中是什么意思?

我不明白C#中的这个错误errorCS0236:Afieldinitializercannotreferencethenon-staticfield,method,orproperty'Prv.DB.getUserName(long)'对于下面的代码publicclassMyDictionary{publicdelegateVNonExistentKey(Kk);NonExistentKeynonExistentKey;publicMyDictionary(NonExistentKeynonExistentKey_){}}classDB{SQLiteConnectionconnecti

java - java中的volatile变量和内存屏障

我有一个由链接节点组成的数据结构。您可以将其视为一个简单的LinkedList。列表的每个节点都包含一些值和指向另一个节点的next字段,如果它是最后一个节点则为null。第一个节点作为根,它没有值,它只指向下一个节点。所有其他节点实际上都是不可变的,一旦它们被创建,它们的值和它们的下一个字段在生命周期内都不会改变,除非正在处理与特定情况相关的结构。一个(只有一个)线程将新节点添加到列表的前面。它是通过构造一个新对象,设置它的字段并将下一个字段设置为根指向的对象,然后将根的下一个字段设置为这个新节点来完成的。其他节点浏览仅执行读取的结构。它们具有对根节点的引用,然后遍历其他节点,直到找

c++ - 为什么将引用计数器值读取为对 volatile 常量的引用?

在smart_ptr\detail\atomic_count_win32.hpp下的Boost1.5.1源代码中,有一个简洁的小原子引用计数器boost::detail::atomic_count。在第48行,他们做了一个我很好奇的类型转换:classatomic_count{public://...operatorlong()const{returnstatic_cast(value_);}private:longvalue_;为什么将计数器值强制转换为a-reference-to-a-volatile-constant-long(longconstvolatile&)?

C++: 奇怪的 "Request for member X of Y which is of non-class type Z"

以下程序,用g++4.6编译,产生错误requestformember‘y’in‘a2’,whichisofnon-classtype‘A(B)’最后一行:#includetemplateclassA{public:Ty;A(Tx):y(x){}};classB{public:intu;B(intv):u(v){}};intmain(){intv=10;Bb1(v);//worksAa1(b1);//doesnotwork(theerroriswhena2isused)Aa2(B(v));//works//Aa2((B(v)));std::cout从代码中包含的工作变体可以看出,在A的

c++ - 何时以及为何会生成 std​​::__non_rtti_object 异常?

我正在使用VisualStudio并执行有效的动态转换。启用RTTI。编辑:更新代码使其更真实structbase{virtualbase*Clone(){base*ptr=newbase;CopyValuesTo(ptr);returnptr;}virtualvoidCopyValuesTo(base*ptr){...}virtual~base(){}}structderived:publicbase{virtualbase*Clone(){derived*ptr=newderived;CopyValuesTo(ptr);returnptr;}virtualvoidCopyValue

c++ - 哪个更好 : a lying copy constructor or a non-standard one?

我有一个包含不可复制句柄的C++类。但是,该类必须有一个复制构造函数。因此,我实现了一个将句柄的所有权转移到新对象的方法(如下所示),classFoo{public:Foo():h_(INVALID_HANDLE_VALUE){};//transferthehandletothenewinstanceFoo(constFoo&other):h_(other.Detach()){};~Foo(){if(INVALID_HANDLE_VALUE!=h_)CloseHandle(h_);};//otherinterestingfunctions...private:///disallowas

c++ - 关于 volatile 使用的规则是否严格?

我看过这句话:thegeneralruleis,ifyouhavevariablesofprimitivetypethatmustbesharedamongmultiplethreads,declarethosevariablesvolatile来自thisarticle,以及这句话:Ingeneral,anydatathatmaybeundatedasynchronouslyshouldbedeclaredtobevolatile.来自thispage,现在考虑到这个引入的规则,我想知道你能否举一个例子,说明尽管存在对数据的异步访问,但声明数据volatile在实践中没有用,或者没有

c++ - `static_cast<volatile void>` 对优化器意味着什么?

当人们试图在各种库中执行严格的基准测试时,我有时会看到这样的代码:autostd_start=std::chrono::steady_clock::now();for(inti=0;i这里使用volatile来防止优化器注意到被测代码的结果被丢弃,然后丢弃整个计算。当被测代码没有返回值时,说它是voiddo_something(int),然后有时我会看到这样的代码:autostd_start=std::chrono::steady_clock::now();for(inti=0;i(do_something(i+j));autostd_stop=std::chrono::steady_

c++ - 为什么 VS 和 gcc 在这里调用不同的转换运算符(const vs non-const)?

这段代码当然很蠢,但我写它只是为了说明问题。在这里:#includeusingnamespacestd;structfoo{inta=42;templateoperatorT*(){cout(&a);}templateoperatorconstT*()const{cout(&a);}templateTget(){coutoperatorT();}};intmain(){foomyFoo;cout()使用VisualStudio2019(ISOC++17,/Ox)编译时的输出是:Tget()operatorconstT*()const42gcc8.3(-std=c++17,-O3)的输出