草庐IT

volatile

全部标签

c++ - 从 volatile 变量中获取值的符合 C++03 的方法是什么?

根据这个defectreportC++03标准不保证在以下代码中:volatileintx;voidf(){x;}从中读取变量。那么我该如何编写只读取volatile变量值并丢弃结果的代码(为了读取而读取)? 最佳答案 inti=x;应该可以。此代码绝对需要读取volatile变量,并且不允许优化器优化读取。但是由于变量i未被使用,优化器可以避免存储读取值所涉及的任何额外工作。您可能还需要这样的东西来避免编译器警告:(void)i; 关于c++-从volatile变量中获取值的符合C++

c++ - 为什么可以相对于非 volatile 访问对这种 volatile 访问进行重新排序?

下面的代码示例来自Chineseblog其中引入了volatile的效果。左边是C代码;另一个是生成的汇编代码。//cordering.cgcc-O2-S-masm=intelcordering.cintA;volatileintB;voidfoo()moveax,DWORDPTRB[rip]{movDWORDPTRB[rip],0A=B+1;addeax,1B=0;movDWORDPTRA[rip],eax}ret正如我们在汇编代码中看到的那样,A的副作用位于B的副作用之后,即使B是volatile合格的。然而,cppreference.comsays:[W]ithinasingle

java - volatile 引用是在线程之间传递 MotionEvents 的安全方式吗?

我很好奇这种方法的安全性,我曾考虑使用这种方法在我的Android应用程序中传递触摸事件(并测试我对Java并发性的理解)。这是基础知识:我有一个连接到SurfaceHolder.Callback的SurfaceView以获取用户输入事件,主要是onTouchEvent回调。调用onTouchEvent方法后,我查看是否event.getAction()==MotionEvent.ACTION_UP,如果是,则调用我命名为postTouchEvent这是我的应用程序线程的成员方法,用于更新应用程序的状态并绘制到Canvas。表面View@OverridepublicbooleanonT

java - 使用 volatile int 的多线程中的兴趣案例

好的。我编写了代码并得到了意想不到的结果,我不知道如何解释这个结果。有人可以帮我解决这个问题吗?publicclassJMM{staticvolatileBooleanready=false;staticvolatileintdata=0;publicstaticvoidmain(){Log.d("JMM","start");newThread(newRunnable(){@Overridepublicvoidrun(){try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}data=1;re

java - 不必要地使用 volatile 关键字——这很危险吗?

如果实际上不需要标记为volatile,那么在Java中将变量设置为“volatile”有什么坏处吗?...还是像我经常读到的那样只是“不必要的”。作为一个涉足多线程的人,但不是计算机科学家,我目前的想法是“如果有疑问,就让它变易变”。 最佳答案 明显的影响是一些小的性能影响,因为编译器被禁止使用certainoptimizations。然而,更糟糕的影响是虚假的安全感。仅仅因为一个变量是易变的并不意味着用它做的所有事情现在都是线程安全的,除非对它的所有操作都是原子的(否则该变量的观察和变化之间可能会断开连接)。仍然需要适当的同步块

c++ - 定义 volatile 类对象

volatile可以用于类对象吗?喜欢:volatileMyclassclassName;问题是它不能编译,当调用某些方法时,到处都会出现错误:错误C2662:“函数”:无法将“this”指针从“volatileMyClass”转换为“MyCLass&”这里有什么问题,如何解决?编辑:classQueue{private:structData*data;intamount;intsize;public:Queue();~Queue();boolvolatilepush(structDataelement);boolvolatilepop(structData*element);void

c++ - 基本类型 volatile 初始化是可观察的行为吗?

考虑这个函数:voidf(void*loc){autop=new(loc)volatileint{42};*p=0;}我已经通过clang、gcc和CL检查了生成的代码,它们都没有省略初始化。(答案可能被hardwer看到了:)。它是编译器对标准提供的扩展吗?该标准是否允许编译器不执行写入42?实际上对于类类型的对象,指定对象的构造函数在不考虑volatile限定符[class.ctor]的情况下执行:Aconstructorcanbeinvokedforaconst,volatileorconstvolatileobject.constandvolatilesemantics(10.

c++ - clang 与 gcc : different code for volatile access

考虑这个例子:volatileunsignedintx;unsignedinty;voidf(){x/=2;}voidg(){y/=2;}当使用-Os编译时,clang-6.0在x64上为f和g生成相同的shrl(%rip)指令模式(见https://godbolt.org/g/hUPprL),而gcc-7.3为f()生成这个(见https://godbolt.org/g/vMcKVV):mov0x200b67(%rip),%eax#601034shr%eaxmov%eax,0x200b5f(%rip)#601034这只是一个错过的优化,还是gcc拒绝shrl(%rip)的理由?如果访

c++ - 从语法的角度来看, "volatile"关键字在 C++ 函数中有多少次用法?

我问这个函数是基于这个概念(也许不正确?!):哪里可以存在const,哪里就可以存在volatile。classclassA{public:constintFoo()const;}这里第一个“const”表示返回值是const,我们不能改变它。第二个const表示“IsQuery”,这个函数不能改变成员变量,也不能调用非const函数。现在谈到volatile:我可以理解volatile对变量的作用,比如“volatileinta;”但是我不知道以下内容之间的区别:Case1:Thereturntypeisvolatile?volatilevoidFunction1();Case2:T

c++ - 使 std::atomic<> 对象具有限定符 - volatile 是否有意义?

使用限定符-volatile来创建原子对象是否有意义?使用那个:volatilestd::atomici(1);代替:std::atomici(1); 最佳答案 不,让std::atomic也具有易变性是绝对没有意义的,因为在std::atomic内部,代码将处理以下可能性变量可能随时更改,并且可能需要“告知”其他处理器它已更改(volatile未涵盖“告知”其他处理器)。你真正需要volatile的唯一时间是你有一个指向你的代码控制的硬件的指针-例如读取定时器中的计数器,或者哪个帧缓冲区是事件的现在,或者告诉网卡从哪里读取下一个要