C 言語における pthread_cancel() の使用方法
pthread_cancel関数は、指定されたスレッドにキャンセル要求を送信し、スレッドが実行中止を要求します。キャンセル要求されたスレッドは、ただちに中止するか、適切なタイミングで中止するかを選択できます。
pthread_cancel関数のプロトタイプは次のとおりです
#include <pthread.h>
int pthread_cancel(pthread_t thread);
- スレッド ID をキャンセル要求として送信する必要があります。
pthread_cancel関数を呼び出した場合、正常にキャンセル要求が送信された場合、対象となるスレッドには要求が通知され、要求を要求されたスレッドは要求された終了への対抗手段を選択できます。キャンセル要求の処理方法について、スレッドのキャンセル状態(キャンセル状態のデフォルトは有効)とキャンセルタイプ(キャンセルタイプのデフォルトは延期キャンセル)を設定することで決定できます。
キャンセル状態は、次の 2 つの状態のいずれかに設定できます。
- PTHREAD_CANCEL_ENABLE: キャンセル要求の有効化。デフォルトステータスであり、キャンセル要求を受け取れることを示します。
- キャンセル要求を無効にする。つまり、キャンセル要求を受信しない。
取り消しタイプは下記の2種類のどちらかに設定できます。
- PTHREAD_CANCEL_DEFERRED:デフォルトタイプで、キャンセルを延期します。スレッドはキャンセル要求を受け取った後も実行を続行し、キャンセルポイントに到着したときにキャンセルされます。
- PTHREAD_CANCEL_ASYNCHRONOUS: 非同期キャンセル。キャンセル要求を受信するとスレッドが直ちに終了することを表す。
通常、スレッドがキャンセル要求を受け取ると、登録されたキャンセル後処理ハンドラ(pthread_cleanup_push、pthread_cleanup_pop 関数で登録)が実行されます。
pthread_cancel関数は対象スレッドに対してキャンセル要求を送信するだけであり、対象スレッドが終了するかどうかは対象スレッド自身の処理によって決まります。対象スレッドがキャンセル要求に応答しない場合、またはキャンセル要求が無効化されている場合、pthread_cancel関数の戻り値はゼロ以外の値で、キャンセル要求の送信に失敗したことを示します。
pthread_cancel 関数が目標スレッドにキャンセル要求を送信し、スレッドが実行を終了することを要求します。キャンセルが要求されたスレッドは、スレッドのキャンセル状態とキャンセルの種類の設定に基づき、ただちに終了することも、適切なタイミングで終了することも選択できます。