2011-07-03 20 views
0

シグナルハンドラでは、変数の値を変更しています。しかし、変数のリーダー_バリアー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

プログラムが更新プログラムに気付かないということを意味しますか?その変数を他の場所でどのように使用しているかを示します。 – user623879

+0

その変数はほかの場所では読み込まれず、書き込まれません。そして、このシグナルハンドラが呼び出された後もプログラムはそれを読んでいますが、まだ更新を見ることはできません。奇妙な! – MetallicPriest

答えて

0

多分、2つの変数は同じ変数ではありません。シグナルハンドラと問題の他のコードの両方にアドレスを印字してみてください。

+0

私は、アドレスが同じであることを確認しました – MetallicPriest

5

sig_atomic_tだけでなく、leader_barriervolatile sig_atomic_tと宣言する必要があります。それ以外の場合、コンパイラは変数が非同期的に変更されないと想定することは自由です。つまり、それは関数の最初に一度読むことができ(例えば)、leaderboardを呼び出すことができる他の関数が呼び出されないと仮定すると、それを再度読み取る必要はありません。

+0

それは、以下のようにvolatileで既に宣言されています... – MetallicPriest

+0

volatile sig_atomic_t leader_barrier; – MetallicPriest

+0

次に、何が起こっているのかを判断するためにもう少しコンテキストを取る予定です。変数はどのように宣言/定義されていますか?それをチェックしているコードは何ですか?それが実行されていることを確認するコードは確実ですか?最適化は有効になっていますか? (ごめんなさい、ご質問にお詫び申し上げます) – andrewdski

関連する問題