将全局变量始终保持可变状态是一种好习惯吗?

时间:2018-12-07 10:25:20

标签: c

我知道volatile是什么意思。我需要问一下,如果我的变量是全局变量,那么即使我不使用与硬件的接口,将变量设置为可变变量也是一种好习惯。

标题:

typedef struct
{
  int Value;
}Var_;
extern volatile Var_ myVariable;

来源:

volatile Var_ myVariable;

2 个答案:

答案 0 :(得分:3)

不。如果要编写多线程代码,则要使用原子变量,而不要使用volatile。例如,许多并发结构需要保持一致,而不是一次修改一个单词。

如果没有其他线程,进程或硬件在修改该变量,则不应使用原子或volatile。它将使程序复杂,运行缓慢并无缘无故禁用某些API。

volatile关键字在历史上曾用于一些不同的事情(例如告诉编译器不要优化延迟循环),但是在C11中它的用途很窄:指定内存中的值将通过某种方式改变,即不遵循原子规则。您需要它来编写某些类型的设备驱动程序,但是it’s discouraged even in other low-level code such as OS kernels.

答案 1 :(得分:1)

不,这不是好习惯。 volatile通知C实现(主要是编译器),对象可能会被C实现之外的某些事物更改,或者访问C实现内的对象可能会在C实现之外产生预期的效果。只要只在您自己的程序中使用和修改全局对象,它就不会产生不稳定的影响,并且用volatile声明它会导致编译器抑制优化并在程序中生成对其的不必要访问。

相关问题