【Linux】volatile | SIGCHLD | 多线程概念

文章目录

1. volatile

在vscode中,创建signal.c文件

故意在while中没有写代码块,让编译器认为在main中,quit只会被检测

运行可执行程序后,当输入 2号信号时,调用自定义方法将quit置为1,跳出while循环

编译器优化

编译器有对应的编译优化级别 -O1 -O2 -O3

在makefile中,添加-O2的优化级别

再次执行可执行程序时,输入2号信号,只调用了对应的自定义方法,说明进入main中的while循环 无法停止

全局变量被加载到内存中
while循环判断实际上是一种计算,会在CPU去执行的
进行计算时,将内存中的数据load到CPU中的寄存器上,然后才对quit进行真假判断
内存中有当前进程的代码和数据,CPU中有对应的PC指针去指向
若while循环条件满足,pc指针继续指向while循环的代码

若while循环条件不满足,则pc指针会向下移动,指向下一条语句,并向后执行

正常来说,每次都要尝试数据从内存load到CPU的过程
在main函数中 quit是没有被修改的,只是被检测,编译器发现quit变量没有被修改,就不会重复把数据从内存load到CPU中
因此编译器会优化,只需第一次把数据从内存load到CPU中,后续只需要检测寄存器中的数据即可


所以刚开始quit为0,将0传给CPU中,后续输入2号信号后,调用自定义方法,quit变为1,
但是在CPU中依旧quit为0,修改了内存中的quit,那CPU中quit就无法影响内存的quit了
一直使用quit为0,所以while循环无法退出

所以要告诉编辑器,保证每次检测,都要从内存中进行数据读取,不要用寄存器中的数据
为了解决这个问题,使用volatile

使quit变为volatile修饰的全局变量
volatile作用:杜绝对quit变量进行寄存器级别的优化,保证内存可见性

版权声明:本文为博主作者:风起、风落原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_62939852/article/details/130693696

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐