標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.4a |
両方 | POSIX(ON) |
#define _OPEN_THREADS
#include <pthread.h>
int pthread_cancel(pthread_t thread);
#define _UNIX03_THREADS
#include <pthread.h>
int pthread_cancel(pthread_t thread);
スレッドを取り消すことを要求します。取り消されるスレッドは、取り消し可能状態と取り消し可能タイプを介してこの取り消し要求が 有効になる時点を制御します。
取り消されるスレッドで結合されるスレッドは、そこへ戻された状況 -1 を もっています。詳細は、pthread_join() - スレッド終了の待機を参照してください。
pthread_t は、スレッドを一意的に識別する場合に使用される データ型です。これは pthread_create() によって戻され、スレッド ID を必要とする アプリケーションで使用されます。
C++ の特殊な動作: スタックの自動オブジェクト用のデストラクターは、スレッドが 取り消されるときに実行されます。スタックはアンワインドされ、デストラクターは逆順に実行されます。
SUSv3 の特殊な動作: Single UNIX 標準バージョン 3 は、取り消し可能な状態およびタイプの新しいシンボルを定義します。これらは上記のシンボルと等価で、SUSv3 ネーム・スペースでコンパイルする場合に使用する必要があります。状態のシンボルは PTHREAD_CANCEL_ENABLE および PTHREAD_CANCEL_DISABLE です。タイプのシンボルは PTHREAD_CANCEL_DEFERRED および PTHREAD_CANCEL_ASYNCHRONOUS です。
正常に実行された場合、pthread_cancel() は 0 を戻します。正常とは、pthread_cancel() 要求が発行されたことを示します。取り消されるスレッドは、その割り込み可能状態のために、なおも実行される 可能性があります。
Single UNIX Specification、バージョン 3 の特殊な動作
正常に実行されなかった場合、pthread_cancel() はエラーを示すエラー番号を戻します。
⁄* CELEBP14 *⁄
#define _OPEN_THREADS
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int thstatus;
void * thread(void *arg)
{
puts("thread has started. now sleeping");
while (1)
sleep(1);
}
main(int argc, char *argv[])
{
pthread_t thid;
void *status;
if ( pthread_create(&thid, NULL, thread, NULL) != 0) {
perror("pthread_create failed");
exit(2);
}
if ( pthread_cancel(thid) == -1 ) {
perror("pthread_cancel failed");
exit(3);
}
if ( pthread_join(thid, &status)== -1 ) {
perror("pthread_join failed");
exit(4);
}
if ( status == (int *)-1 )
puts("thread was cancelled");
else
puts("thread was not cancelled");
exit(0);
}
thread has started. now sleeping
thread was canceled