Переменная, обновленная внутри обработчика сигнала, никогда не обновляется - PullRequest
0 голосов
/ 03 июля 2011

В обработчике сигнала я меняю значение переменной. Однако программа никогда не замечает обновления, хотя я объявил переменную 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 внутри него, как я видел, печатая его значения внутри обработчика сигнала.

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Вы должны объявить leader_barrier как volatile sig_atomic_t, а не просто sig_atomic_t.В противном случае компилятор может предположить, что переменная не изменяется асинхронно.Таким образом, он может прочитать его один раз в начале функции (скажем), и, предполагая, что никакие другие функции, которые могут изменить leaderboard, не будут вызваны, ему не нужно читать это снова.

0 голосов
/ 03 июля 2011

Возможно, две переменные не являются одной и той же переменной. Попробуйте напечатать их адреса как в обработчике сигналов, так и в другом рассматриваемом коде.

...