sig_atomic_t类型与volatile限定符

sig_atomic_t类型与volatile限定符


volatile:防止编译器优化


代码:

  1 #include<stdio.h>
  2 #include<signal.h>
  3 int a=0;
  4 void signal_handler(int signal)
  5 {
  6     printf("signal is coming\n");
  7     a=1;
  8 }
  9 int main()
 10 {
 11     signal(2,signal_handler);
 12   while(!a);
 13   return 0;
 14 
 15 }

结果:

[admin@www SIGNAL]$ gcc -o thread_safety thread_safety.c -O3
[admin@www SIGNAL]$ ./thread_safety 
^Csignal is coming
^Csignal is coming
^\退出 (core dumped)

编译器优化,直接从寄存器取值,为了防止优化,采用sig_atomic_t类型与volatile限定符。

4 volatile int a=0;
或
4 volatile sig_atomic_t  a=0;
结果:
[admin@www SIGNAL]$ gcc -o thread_safety thread_safety.c -O3
[admin@www SIGNAL]$ ./thread_safety 
^Csignal is coming


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章