2016-10-18 4 views
1

私はLinuxシステム上で自分のアプリケーションに4 pthreadを持っています。シグナルハンドラ関数でローカルミューテックスを使用して共有データを同期する

SIGTERMは3つのスレッドでブロックされ、シグナルハンドラ機能では1つのスレッドのみが処理されます。私は以下のコードは、mutexがシグナルハンドラ関数でローカルに作成され、主にそれを基にして何かをする必要のある別のスレッドに共有データ変数への変更をプッシュするためにのみ使用されるので安全だと思います。

私の理解は正しいですか?

void sig_handler_sigterm() 
{ 
    mutex * m = new mutex; 
    mutex_lock(m); 
    //update shared data, the change needs to reflect in another thread 
    mutex_unlock(m) 
    sleep(2); 
    exit(1); 
} 
+1

ローカルミューテックスは無意味です。ミューテックスは複数のスレッドが*ロック/アンロックする場合にのみ有効です。 – kaylum

+0

シグナルハンドラ内から 'exit()'を呼び出すことも安全です。これは非同期シグナル安全ではありません。 –

+0

ミューテックスのロック/アンロック機能がメモリの獲得/解放を保証し、共有データが他のスレッドにプッシュされることは本当ですか? – medicine28

答えて

0

いいえまず、これはミューテックスの仕組みではありません。 2つのスレッドはミューテックスを共有しなければならず、両方ともスレッドをロックする必要があります。したがって、ローカル変数にすることはできません。次のことは、信号から標準ライブラリー関数のサブセットsubset of standard library functionsのみを呼び出すことは安全です。新しい内部で使うことができるbrk()はそれらの一つではありません。だから、メモリに信号を割り当てるのは良い考えではありません。

次の点は、1秒間スリープしても、他のスレッドに必要な処理を行うのに十分な時間があるとは限りません。

関連する問題