pthread_cancel() - スレッドの取り消し

標準

標準/拡張機能 C/C++ 依存項目

POSIX.4a
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

int pthread_cancel(pthread_t thread);
SUSV3:
#define _UNIX03_THREADS
#include <pthread.h>

int pthread_cancel(pthread_t thread);

機能説明

スレッドを取り消すことを要求します。取り消されるスレッドは、取り消し可能状態と取り消し可能タイプを介してこの取り消し要求が 有効になる時点を制御します。

取り消し可能状態は次のとおりです。
PTHREAD_INTR_DISABLE
スレッドは取り消すことができません。
PTHREAD_INTR_ENABLE
スレッドは取り消すことができますが、タイプによります。
取り消し可能タイプは次のとおりです。
PTHREAD_INTR_CONTROLLED
スレッドは取り消すことができますが、次の特定の実行ポイントでのみ可能です。
  • 条件変数で待っているとき。これは pthread_cond_wait() または pthread_cond_timedwait() です。
  • 別のスレッドの終了を待っているとき。これは pthread_join() です。
  • 非同期のシグナルを待っているとき。これは sigwait() です。
  • 取り消し要求を具体的にテストしているとき。これは pthread_testintr() です。
  • POSIX 関数、または標準 C 関数 close()、 fcntl()、open()、pause()、read()、tcdrain()、 tcsetattr()、sigsuspend()、sigwait()、sleep()、 wait()、または write() いずれかにより 中断しているとき。
PTHREAD_INTR_ASYNCHRONOUS
スレッドはいつでも取り消すことができます。

取り消されるスレッドで結合されるスレッドは、そこへ戻された状況 -1 を もっています。詳細は、pthread_join() - スレッド終了の待機を参照してください。

pthread_t は、スレッドを一意的に識別する場合に使用される データ型です。これは pthread_create() によって戻され、スレッド ID を必要とする アプリケーションで使用されます。

注: mutex 待機中のスレッドは、シグナルによって 中断されず、したがって取り消されません。

C++ の特殊な動作: スタックの自動オブジェクト用のデストラクターは、スレッドが 取り消されるときに実行されます。スタックはアンワインドされ、デストラクターは逆順に実行されます。

SUSv3 の特殊な動作: Single UNIX 標準バージョン 3 は、取り消し可能な状態およびタイプの新しいシンボルを定義します。これらは上記のシンボルと等価で、SUSv3 ネーム・スペースでコンパイルする場合に使用する必要があります。状態のシンボルは PTHREAD_CANCEL_ENABLE および PTHREAD_CANCEL_DISABLE です。タイプのシンボルは PTHREAD_CANCEL_DEFERRED および PTHREAD_CANCEL_ASYNCHRONOUS です。

戻り値

正常に実行された場合、pthread_cancel() は 0 を戻します。正常とは、pthread_cancel() 要求が発行されたことを示します。取り消されるスレッドは、その割り込み可能状態のために、なおも実行される 可能性があります。

正常に実行されなかった場合、pthread_create() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
指定されたスレッドは無効です。
ESRCH
指定されたスレッドは、現在存在しているスレッドを指していません。

Single UNIX Specification、バージョン 3 の特殊な動作

正常に実行されなかった場合、pthread_cancel() はエラーを示すエラー番号を戻します。

CELEBP14
⁄* 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

関連情報