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


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