在信号处理程序中,我正在改变变量的值。但是,即使我已将变量 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;
}
确认 timer_action 确实执行了,而 leader_barrier 确实在其中变为1,正如我在信号处理程序中打印其值所看到的那样。
答案 0 :(得分:5)
您应将leader_barrier
声明为volatile sig_atomic_t
,而不只是sig_atomic_t
。否则,编译器可以自由地假设变量不会异步更改。也就是说,它可以在函数的开头读取一次(比如说),假设没有其他函数可以改变leaderboard
被调用,则不需要再次读取它。
答案 1 :(得分:0)
也许这两个变量不是同一个变量。尝试在信号处理程序和其他相关代码中打印它们的地址。