PTHREAD_CANCEL

Section: C Library Functions (3)
Updated: LinuxThreads
IndexJM Home Page

 

NAME

pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel - スレッドの取り消し

 

書式

#include <pthread.h>

int pthread_cancel(pthread_t thread);

int pthread_setcancelstate(int state, int *oldstate);

int pthread_setcanceltype(int type, int *oldtype);

void pthread_testcancel(void);

 

説明

取り消しは、あるスレッドが他のスレッドの実行を終了させることを可能 にするメカニズムである。より正確には、スレッドは他のスレッドに対して 取消要求を送ることができる。設定次第で、目標のスレッドは、要求を無視 したり、直ちに実現したり、ある取り消しポイントに至るまでその要求の実行 を延期したりできる。

スレッドが最終的に取り消し要求を実現する際には、それはあたかもpthread_exit(PTHREAD_CANCELED)がその時点で呼び出されたかのように振舞う。すなわち、全てのクリーン アップハンドラが逆順に実行され、スレッド固有データの終了処理関数が 呼び出され、最後にスレッドは、返り値PTHREAD_CANCELで実行を停止する。詳しくはpthread_exit(3) を見よ。

pthread_cancelthread引数で指定されたスレッドに対して、取り消し要求を送る。

pthread_setcancelstateは、これを呼び出すスレッドの取り消し状態を変更する。 すなわち、取り消し要求を受け入れるか否かを変更する。state引数は新たな取り消し状態である。これは取り消しを可能にするPTHREAD_CANCEL_ENABLEもしくは、取り消しを不可能にする(取り消し要求を無視する)PTHREAD_CANCEL_DISABLEのいずれかである。oldstateNULLでなければ、以前の取り消し状態がoldstateが指す場所に格納され、従って、後で別のpthread_setcancelstateの呼び出しにより、回復することができる。

pthread_setcanceltypeは、これを呼び出すスレッドの取り消し要求に対する反応の型を変更する。 これは、非同期(即時)または遅延のいずれかである。type引数は、新たな取り消し方であり、取り消し要求が届くと直ちに呼び出し スレッドを取り消すPTHREAD_CANCEL_ASYNCHRONOUSか、取り消し要求を次の取り消しポイントまで留保するPTHREAD_CANCEL_DEFERREDかのいずれかである。oldtypeNULLでなければ、以前の取り消し型がoldtypeの指す場所に格納され、従って、後から別のpthread_setcanceltypeの呼び出しによって回復することが可能である。

スレッドは常にpthread_create(3) によって、取り消し可能かつ遅延で作成される。 すなわち、初期の取り消し状態はPTHREAD_CANCEL_ENABLEであり、初期の型はPTHREAD_CANCEL_DEFERREDである。

取り消しポイントとは、保留中の取り消し要求に対するテストが行われ、 実際に要求があれば取り消しが実行される点である。以下の POSIX スレッド 関数は取り消しポイントである:

pthread_join(3)
pthread_cond_wait(3)
pthread_cond_timedwait(3)
pthread_testcancel(3)
sem_wait(3)
sigwait(3)

これ以外の全ての POSIX スレッド関数は取り消しポイントではないことが保証 されている。すなわち、それらは遅延取り消しモードで決して取り消しを 実現することはない。

pthread_testcancelは保留中の取り消し要求を調べ、それを実現するだけである。その目的は、 他に取り消しポイントとなる関数を呼び出すことのない、長い連続した コードの中に、明示的に取り消しのチェックを導入することである。

 

返り値

pthread_cancel、pthread_setcancelstateおよびpthread_setcanceltypeは成功すると 0 を返し、エラーならば、非ゼロのエラーコードを返す。

 

エラー

pthread_cancelはエラーの際に次のエラーコードを返す:
ESRCH
threadで指定されたものに対応するスレッドが存在しない。 ID.

pthread_setcancelstateはエラーの際に次のエラーコードを返す:

EINVAL
statePTHREAD_CANCEL_ENABLEでもPTHREAD_CANCEL_DISABLEでもない。

pthread_setcanceltypeはエラーの際に次のエラーコードを返す:

EINVAL
type引数がPTHREAD_CANCEL_DEFERREDでもPTHREAD_CANCEL_ASYNCHRONOUSでもない。

 

著者

Xavier Leroy <Xavier.Leroy@inria.fr>

 

関連項目

pthread_exit(3),pthread_cleanup_push(3),pthread_cleanup_pop(3).

 

バグ

POSIX は一連のシステムコール(基本的にはread(2),write(2),wait(2), 等のようなブロックの可能性のある全ての関数)とそれらのシステムコール を呼ぶようなライブラリ関数(例えばfprintf(3)) が取り消しポイントであると規定している。 LinuxThreads はこれを実装する には、まだ十分に C ライブラリと統合されていると言えず、 従っていかなる C ライブラリの関数も取り消しポイントではない。

少なくとも、システムコールに対してはこれを回避する方法がある。 取り消し要求は、目標スレッドにシグナルを送ることによって送信される。 このシグナルはブロックしているシステムコール全てに対して割込みを掛け、 それらは直ちにEINTRで戻る。よって、例えばreadシステムコールを呼んでいる間に取り消しをチェックするには、次のように すれば良い:

pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();

[訳注] 上の記述は glibc2 を用いたシステムでは正しくない。以下は glib-2.1.2 の info ファイルからの引用である。

取り消しポイントとは、保留中の取り消し要求に対するテストが行われ、 実際に要求があれば取り消しが実行される点である。POSIX スレッド関数 のうち、`pthread_join', `pthread_cond_wait', `pthread_cond_timed_wait', `pthread_testcancel', `sem_wait' 及び `sigwait' は取り消しポイント である。 これに加えて、以下のシステムコールは取り消しポイントである:


 accept                   open                     sendmsg                  
 close                    pause                    sendto                   
 connect                  read                     system                   
 fcntl                    recv                     tcdrain                  
 fsync                    recvfrom                 wait                     
 lseek                    recvmsg                  waitpid                  
 msync                    send                     write                    
 nanosleep                                                                  

これらの関数を呼び出す可能性のある printf() などのライブラリ関数も 取り消しポイントになる場合がある。


関連キーワード

取り消し,pthread,PTHREAD,CANCEL,ポイント,testcancel,wait,int,エラー,setcancelstate 

Index

NAME
書式
説明
返り値
エラー
著者
関連項目
バグ

This document was created byman2html, using the manual pages.
Time: 15:49:14 GMT, July 11, 2021