スレッドのキャンセル/取り消し


1スレッドキャンセルの定義
一般に、スレッドは、そのマスター関数が終了すると自動的に終了しますが、別のスレッドからの終了(キャンセル)要求を受信したために強制的に終了することもできます.
2スレッドキャンセルの意味
1.スレッドキャンセルの方法は、ターゲットスレッドにCancel信号を送信することであるが、Cancel信号をどのように処理するかは、ターゲットスレッドによって自分で決定されるか、無視されるか(キャンセルが禁止されている場合)、または直ちに終了するか(キャンセルポイントまたは非同期モードの場合)、またはCancelation-point(キャンセルポイント、以下に説明する)まで実行され続けるか、つまり異なるCancelation状態によって決定される.
2.スレッドがCANCEL信号を受信したデフォルト処理(すなわちpthread_create()スレッド作成のデフォルト状態)は、キャンセルポイント再処理(終了)まで実行し続けるか、非同期で直接終了する.1つのスレッドがcancel要求を処理する終了操作はpthread_に相当するexit(PTHREAD_CANCELED).もちろんスレッドはPTHREAD_に設定できますCANCEL_DISABLEは、cancelリクエストの処理を拒否します.後で説明します.
3.スレッドのキャンセルは、スレッドの動作(joinableまたはdetached)とは無関係です.
3キャンセルポイント
POSIX規格によるpthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()などの関数およびread()、write()などのブロックを引き起こすシステム呼び出しはCancelation-pointであり、他のpthread関数はCancelation動作を起こさない.
でもpthread_cancelのマニュアルページによると、LinuxThreadライブラリはCライブラリとうまく結合していないため、現在のCライブラリ関数(例えばread()はlinux種ではCancelation-pointではないという.ただし、CANCEL信号は、ブロックされたシステム呼び出しからスレッドを終了させ、EINTRエラーコードをセットするので、Cancelation-pointとして必要なシステム呼び出しの前後でpthread_を呼び出すことができるtestcancel()は、POSIX規格に要求される目標、すなわち、次のコードセグメントを達成する.               pthread_testcancel();               retcode = read(fd, buffer, length);               pthread_testcancel();
4プログラム に する
1.スレッドが ループにあり、ループ でキャンセルポイントへの なパスが されていない 、スレッドは の のスレッドのキャンセル によって できません.したがって、このような の にpthread_を えるべきである.testcancel() び し.
2.pthread_cancel()が ると、スレッドがキャンセルされたとは らず、リクエストをターゲットスレッドに するだけで、ターゲットスレッドは キャンセルポイントに していません.スレッドがいつ されたかを るには、キャンセル にpthread_を び す があります.join().1つの は、スレッドがdetachされた 、このように できないことです.a)joinがdetachedされたスレッドである 、EINVALを します.b)join にスレッドがdetachedに されている 、detachは しません.したがって、スレッドが された で される があることを っていれば、pthread_cancel() にpthread_を び すjoin().
5スレッドキャンセルに するpthread
int pthread_cancel(pthread_t thread)は、threadスレッドに を し、 すれば0を し、そうでなければ0 の を します. が したからといって、threadが するわけではありません.
int pthread_setcancelstate(int state,int*oldstate)このスレッドのCancel に する を します.stateにはPTHREAD_の2つの があります.CANCEL_ENABLE(デフォルト)とPTHREAD_CANCEL_DISABLEは、それぞれ を した にCANLED と CANCEL を して を することを す.old_stateがNULLでない は のCancel に します.
int pthread_setcanceltype(int type,int*oldtype)は、このスレッドのキャンセル の タイミングを します.typeは、PTHREAD_の2つの から されます.CANCEL_DEFFEREDとPTHREAD_CANCEL_ASYCHRONOUSは、Cancel がEnableの のみ であり、それぞれ を した 、 のキャンセルポイントまで を して し、 ちにキャンセル ( )を することを す.oldtype NULLでなければ、 ばれてきたキャンセル タイプ が されます.
void pthread_testcancel(void)このスレッドがCanceld であるかどうかを し、もしそうであればキャンセル を い、そうでなければ ります.