メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

スレッドを強制終了するための信号の使用

キャッチされていない信号による、特定のスレッドではなくプロセス全体の強制終了

説明

この欠陥は、スレッドを強制終了するためにキャッチされていない信号を使用した場合に発生します。たとえば、スレッドを強制終了するために POSIX® 関数 pthread_kill を使用して信号 SIGTERM を送信します。

リスク

信号を送信すると、強制終了しようとしているスレッドだけでなく、プロセス全体が強制終了します。

たとえば、pthread_kill の仕様によると、信号の処理方法が終了の実行である場合、このアクションはプロセス全体に影響します。

修正方法

特定のスレッドを強制終了することを目的とした他のメカニズムを使用します。

たとえば、POSIX 関数 pthread_cancel を使用して特定のスレッドを終了します。

すべて展開する

#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
  }
  if ((result = pthread_kill(thread, SIGTERM)) != 0) {
  }
 
  /* This point is not reached because the process terminates in pthread_kill() */
 
  return 0;
}

この例では、関数 pthread_kill はスレッドを強制終了するために信号 SIGTERM を送信します。信号により、前に pthread_create を使用して作成したスレッドではなく、プロセス全体が強制終了します。

修正 — pthread_cancel を使用してスレッドを終了

1 つの修正方法として、関数 pthread_cancel を使用します。pthread_cancel は、スレッドのキャンセル タイプに応じて、最初の引数で指定されたスレッドを特定のキャンセル ポイントで終了するか、直ちに終了します。

#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
    /* Handle Error */
  }
  if ((result = pthread_cancel(thread)) != 0) {
    /* Handle Error */
  }
 
  /* Continue executing */
 
  return 0;
}

参考:

  • キャンセル タイプの詳細については pthread_cancel を参照。

  • キャンセル ポイントにすることができる関数については Pthreads を参照。

結果情報

グループ: 同時実行
言語: C | C++
既定値: オフ
コマンド ライン構文: THREAD_KILLED_WITH_SIGNAL
影響度: Low

バージョン履歴

R2018b で導入