目录
1.概念
2.volatile关键字
1.概念
在执行流执行到mian函数,insert函数中的1号位置的时候,突然就陷入内核,处理信号,执行信号自定义方法,这个方法调用的也是insert,执行完之后,导致了n2的节点丢失,那么这个函数就叫不可重入函数,如果在执行流重复进入的情况下不会出问题的就叫,可重入函数。
2.volatile关键字
概念:
这个关键字主要就是防止编译器的优化,保持内存的可见性。
#include <stdio.h>
#include <signal.h>
int flag = 0;
void handler(int signo)
{
flag = 1;
printf("flag change %d\n", flag);
}
int main()
{
signal(2, handler);
while (!flag);
printf("eixt\n");
return 0;
}
这段代码,首先自定义捕捉了2号信号,然后让其阻塞到while循环这,直到flag变为1退出。
没啥问题吧,但是如果编译器开启优化呢?
gcc默认优化是 -O0 ,就是不优化,还有-O1,-O2,分别对应着不同优化等级。
使用-O1编译一下。
我们发现已经终止不了,这是因为编译器看我们的main函数中没有对flag的修改,直接就把flag放到寄存器中了,省着还要和内存交互,但是我们对内存的flag修改,并不会影响寄存器。
我们使用volatile关键字修饰flag,flag就不会被放到寄存器中。
优化即使开到最大也不会有问题。