volatile 关键字

来源:互联网 发布:办公自动化软件速成班 编辑:程序博客网 时间:2024/06/13 09:53

我相信你一定遇到过这样的问题:你把某人的名字和电话号码写到你的通讯录中,数个月之后企图打电话给这个人,却发现资料已经过期了。

同样的情况也可能发生在编译器为你产生的程序代码中。


编译器最优化的结果是,设法把常用到的数据放在 CPU 的内部寄存器中。这些寄存器就像你的通讯录一样。数据从寄存器中读出,远比从内存中读出快得多。

当然啦,如果另一个线程改变了内存中的变量值,那么此变量在寄存器中的拷贝值就算是“过期”了


在一个单线程中这种情况不可能发生。编译器可以分析你的程序的每一个操作,然后确保数据在适当时候会被重新载入。然而在一个多线程程序中就不可能知道其他线程在做什么,所以编译器一定不能够允许让一个共享变量的值拷贝到寄存器中


CC++ 有 一 个 鲜 为 人 知 的 关 键 字 , 教 导 编 译 器 如 何 在 一 个variable-by-variable的基础上采取行动。这个关键字是 volatile(译注:中文意思是“有挥发性的、易变的”)。这个关键字告诉编译器不要持有变量的临时性拷贝它可以适用于基础类型,如intlong,也适用于一整个C结构或C++。后面这种情况下,结构或类的所有成员都会被视为volatile



即使使用了volatile关键词,依然必须要加锁

使用volatile 并不会否定 critical sections mu texes 的需要。例如你说:
a = a + 3
还是会有一小段时间,a会被放置在一个寄存器中,因为算术运算只能够在寄存器中进行。一般而言,volatile 关键字适用于行与行之间,而不是放在行内。




0 0
原创粉丝点击