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