2011-12-13 20 views
13

thisサイトによれば、シグナルハンドラ内にはタイプvolatile sig_atomic_tの変数を使用できます。今私の質問は、例えば、次のようなコードはまだ原子的であり、したがって競合状態を導入しないだろうか?volatile sig_atomic_tの適切な使用

マルチコアプロセッサ(EDIT:マルチスレッドプログラムを実行中)を使用しているとします。 volatile sig_atomic_tはマルチコアシステムでも動作しますか?マルチコアシステムのシグナルハンドラにはC++ 11のatomic<unsigned int>を使用する必要がありますか(EDIT:マルチスレッドプログラムの実行)?

volatile sig_atomic_t a; 

static void signal_handler(int sig, siginfo_t *si, void *unused) 
{ 
    int b; 
    ................ 
    b = ...; 
    a = a | b; 
    ................ 
} 
+0

あなたの質問は答えられました(「volatileのsig_atomic_tはマルチコアシステムでも動作しますか?」 - いいえ)ので、回答を受け入れる必要があります。 – Bulwersator

答えて

15

プログラムがマルチスレッドでない限り、シグナルハンドラはプログラムの他のコードと同時に実行されることはなく、中断したコードと同時に実行されることはありません。シグナルsigがシグナルハンドラの期間マスクされていれば、コードは問題ありません。

+2

私のプログラムはマルチスレッドです。 – MetallicPriest

+18

さて、 'sig_atomic_t'はマルチスレッドアスペクトとは関係ありません。これは、同じスレッド*でシグナルハンドラ*によって中断された操作の原子性を保証するためにのみ関連します。つまり、(1)メインプログラムフローが上位バイトを書き込み、(2)シグナルハンドラが(3)メインプログラムフローは、ローバイトを書き込む(部分書き込み間の信号による中断のために)。 –