volatile and assert

volatile and assert

volatile

volatile 修饰的变量,在对其进行读写操作时,会引发一些可观测的副作用。而这些可观测的副作用,是由程序之外的因素决定的

volatile 会在编译的时候优化一些它认为无效的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int  *output = (unsigned  int *)0xff800000; //定义一个IO端口;  
int init(void)
{
int i;
for(i=0;i< 10;i++)
{
*output = i;
}
}
// 编译器会直接优化为
int init(void)
{
*output = 9;
}
// 但有些情况不希望这种优化发生

volatile通知编译器这个变量是一个不稳定的,在遇到此变量时候不要优化。

多线程应用中被多个任务共享的变量。 当多个线程共享某一个变量时,该变量的值会被某一个线程更改,应该用 volatile 声明。作用是防止编译器优化把变量从内存装入CPU寄存器中,当一个线程更改变量后,未及时同步到其它线程中导致程序出错。volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
volatile  bool bStop=false;  //bStop 为共享全局变量  
//第一个线程
void threadFunc1()
{
...
while(!bStop){...}
}
//第二个线程终止上面的线程循环
void threadFunc2()
{
...
bStop = true;
}

assert

断言,是宏,而非函数。assert 宏的原型定义在 (C)、(C++)中,其作用是如果它的条件返回错误,则终止程序执行。ASSERT 只有在 Debug 版本中才有效,可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include 之前。

1
#define NDEBUG  
  • Copyrights © 2018-2022 Haojia Zhu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信