Met*_*est 0 c linux signals handler
在信号处理程序中,我正在改变变量的值.但是,程序从未注意到更新,即使我已将变量leader_barrier声明为sig_atomic_t.
void timer_action(int signum)
{
static int count = 0;
if ( !(*pbarrier_in_proc) && !(leader_barrier) && !(*pno_more) )
leader_barrier = 1;
}
Run Code Online (Sandbox Code Playgroud)
并且它确认了timer_action确实执行并且leader_barrier确实在其中变为1,正如我通过在信号处理程序中打印其值所看到的那样.
你应该申报leader_barrier的volatile sig_atomic_t,不只是sig_atomic_t.否则,编译器可以自由地假设变量不会异步更改.也就是说,它可以在函数的开头读取一次(比如说),假设没有其他可以改变的函数leaderboard被调用,它就不需要再次读取它.