草庐IT

non-volatile

全部标签

c++ - 用于线程控制的 volatile bool 是否被认为是错误的?

根据我对thisquestion的回答,我开始阅读关键字volatile以及关于它的共识。我看到有很多关于它的信息,一些旧的现在看起来是错误的,还有很多新的说它在多线程编程中几乎没有位置。因此,我想澄清一个具体的用法(在SO上找不到确切的答案)。我还想指出,我确实了解编写多线程代码的一般要求以及为什么volatile不能解决问题。不过,我在我工作的代码库中看到使用volatile进行线程控制的代码。此外,这是我使用volatile关键字的唯一情况,因为所有其他共享资源都是正确的同步。假设我们有这样一个类:classSomeWorker{public:SomeWorker():isRun

c++ - 我什么时候在 C++ 中使用 const volatile、register volatile、static volatile?

我想知道volatile关键字与register、const和static结合的不同用途关键词。我不确定有什么影响,所以我认为:registervolatileintT=10;建议编译器将T存储在寄存器中,T的值可以从外部某处(操作系统、硬件、另一个线程)修改constvolatileintT=10;程序本身不能修改T,但是T可以在代码之外的地方修改。staticvolatileintT=10;如果T是类的数据成员,则意味着该类的所有对象都具有相同的T值,并且T可以从外部某处修改。如果T是文件中的全局变量,则其他文件(属于项目的一部分)中的源代码无法访问T,但可以从外部某处访问T。如果

c++ - 为什么 std::atomic<bool> 比 volatile bool 慢得多?

多年来我一直在使用volatilebool进行线程执行控制,效果很好//inmyclassdeclarationvolatileboolstop_;-----------------//Inthethreadfunctionwhile(!stop_){do_things();}现在,由于C++11增加了对原子操作的支持,我决定尝试一下//inmyclassdeclarationstd::atomicstop_;-----------------//Inthethreadfunctionwhile(!stop_){do_things();}但它比volatilebool慢几个数量级!我编

c++ - 带有空主体的while循环检查 volatile 整数-这是什么意思?

我正在查看具有以下几行的C++类:while(x>y);returnx-y;x和y是volatileint类型的成员变量。我不明白这个结构。我在这里找到了代码stub:https://gist.github.com/r-lyeh/cc50bbed16759a99a226.我猜它不能保证正确甚至有效。 最佳答案 自从x和y已被声明为volatile,程序员希望它们会从程序外部进行更改。在这种情况下,您的代码将保留在循环中while(x>y);并将返回值x-y从外部更改值后,x.在您告诉我们更多有关您的代码以及您在哪里看到它之后,可以猜

c++ - 为什么将 "pointer to pointer to non-const"转换为 "pointer to pointer to const"是不合法的

将指向非常量的指针转换为指向常数的指针是合法的。那么为什么将指向非const的指针转换为指向const的指针是不合法的呢?例如,为什么下面的代码是非法的:char*s1=0;constchar*s2=s1;//OK...char*a[MAX];//akachar**constchar**ps=a;//error! 最佳答案 来自标准:constcharc='c';char*pc;constchar**pcc=&pc;//notallowed*pcc=&c;*pc='C';//wouldallowtomodifyaconstobjec

c++ - 没有 volatile 的互斥锁功能是否足够?

我和一位同事为在x86、x64、Itanium、PowerPC和其他10年前的服务器CPU上运行的各种平台编写软件。我们刚刚讨论了pthread_mutex_lock()...pthread_mutex_unlock()等互斥函数本身是否足够,或者protected变量是否需要为volatile。intfoo::bar(){//...//codewhichmayormaynotaccess_protected.pthread_mutex_lock(m);intret=_protected;pthread_mutex_unlock(m);returnret;}我关心的是缓存。编译器能否将

C++ volatile 成员函数

classMyClass{intx,y;voidfoo()volatile{//dostuffwithx//dostuffwithy}};我需要将x和y声明为volatile还是将所有成员变量都视为volatile自动?我想确保编译器不会将“带有x的东西”重新排序为“带有y的东西”。编辑:如果我将普通类型转换为volatile类型会发生什么?这会指示编译器不要重新排序对该位置的访问吗?我想在特殊情况下将普通变量传递给参数为volatile的函数。我必须确保编译器不会通过之前或之后的读写重新排序该调用。 最佳答案 标记一个成员函数vo

c++ - C/C++ : switch for non-integers

很多时候我需要根据一个非POD常量元素的值来选择做什么,像这样:switch(str){case"foo":...case"bar":...default:...}遗憾的是switch只能与整数一起使用:错误:开关量不是整数。实现这样的事情最简单的方法是拥有一个ifs序列:if(str=="foo")...elseif(str=="bar")...else...但是这个解决方案看起来很脏,应该花费O(n),其中n是案例的数量,而在最坏的情况下,使用二分搜索,这段代码可能花费O(logn)。使用一些数据结构(如Maps)可以获得一个表示字符串的整数(O(logn)),然后使用O(1)sw

c++ - GNU 编译器警告 "class has virtual functions but non-virtual destructor"

我在C++中定义了一个接口(interface),即一个只包含纯虚函数的类。我想明确禁止接口(interface)的用户通过指向接口(interface)的指针删除对象,所以我为接口(interface)声明了一个protected非虚拟析构函数,类似于:classITest{public:virtualvoiddoSomething()=0;protected:~ITest(){}};voidsomeFunction(ITest*test){test->doSomething();//ok//deletingobjectisnotallowed//deletetest;}GNU编译器

go - 向 chan 发送了一个 nil 指针,但收到了 "non-nil"

packagemainimport("fmt""os/exec")funcmain(){errChan:=make(chanerror)gofunc(){vare*exec.Error=nilerrChan输出很奇怪:err!=nil,buterr=在这里试试:http://play.golang.org/p/_iyh0m7O1a 最佳答案 问题在于作为错误接口(interface)传入channel的值不是nil,而是一个指向nil的exec.Error指针。如果您进行更改,程序将正常运行:gofunc(){vare*exec.E