スレッド制御のキャンセルオプション

3544 ワード

2つのスレッド属性がpthread_に含まれていませんattr_t構造では、これらはキャンセル可能な状態とキャンセル可能なタイプである.この2つのプロパティは、pthread_に応答するスレッドに影響します.cancel関数(http://www.cnblogs.com/nufangrensheng/p/3519175.html)呼び出し時に表示される動作.
キャンセル可能ステータス属性はPTHREAD_CANCEL_ENABLE、PTHREADでもいいですCANCEL_DISABLE.スレッドはpthread_を呼び出すことができますsetcancelstateキャンセル可能なステータスを変更します.
#include <pthread.h>

int pthread_setcancelstate(int state, int *oldstate);

   :      0,        

pthread_setcancelstate現在のキャンセル可能な状態をstateに設定し、元のキャンセル可能な状態をoldstateが指すメモリユニットに格納します.この2つのステップは原子操作です.
pthread_cancel呼び出しはスレッドの終了を待つものではありません.デフォルトでは、スレッドがキャンセルポイントに達するまで、キャンセル要求が発行された後も実行を続けます.キャンセルポイントは、スレッドがキャンセルされたかどうかをチェックし、要求に従って動作する場所です.POSIX.1スレッド呼び出しテーブル12-7にリストされている関数のいずれかがキャンセルポイントとして表示されることを保証します.
表12-7 POSIX.1定義されたキャンセルポイント
1345694905_5425
スレッド起動時のデフォルトキャンセル可能状態時PTHREAD_CANCEL_ENABLE.ステータスがPTHREAD_に設定されている場合CANCEL_DISABLEの場合、pthread_cancelの呼び出しはスレッドを殺すことはありません.逆に、リクエストのキャンセルはこのスレッドにとって未決です.キャンセル状態が再びPTHREAD_になるとCANCEL_ENABLEの場合、スレッドは次のキャンセルポイントですべての未解決のキャンセル要求を処理します.
表12-7に示す関数を除く、POSIX.1テーブル12~8にリストされている関数もオプションのキャンセルポイントとして指定します.
表12-8 POSIX.1定義されたオプションキャンセルポイント
20140112143249812
アプリケーションが長い間テーブル12-7またはテーブル12-8の関数を呼び出さない場合はphread_を呼び出すことができます.testcancel関数は、プログラムにキャンセルポイントを自分で追加します.
#include <pthread.h>

void pthread_testcancel(void);

pthread_を呼び出すtestcancelの場合、キャンセル要求が未解決で、キャンセルが無効に設定されていない場合、スレッドはキャンセルされます.ただし、キャンセルが無効に設定されている場合はpthread_testcancel呼び出しは何の効果もありません.
ここで説明するデフォルトのキャンセルタイプは、遅延キャンセルとも呼ばれます.pthread_を呼び出すcancel以降、スレッドがキャンセルポイントに達するまで、本格的なキャンセルは発生しません.pthread_を呼び出すことができますsetcanceltypeでキャンセルタイプを変更します.
#include <pthread.h>

int pthread_setcanceltype(int type, int *oldtype);

   :      0,        

typeパラメータはPTHREAD_でもよいCANCEL_DEFERRED、PTHREADであってもよいCANCEL_ASYNCHRONOUS,pthread_setcanceltype関数はキャンセルタイプをtypeに設定し、元のキャンセルタイプをoldtypeが指す整数ユニットに返します.
非同期キャンセルは遅延キャンセルとは異なり、非同期キャンセルを使用する場合、キャンセルポイントに遭遇しなければキャンセルできないのではなく、スレッドは任意の時間にキャンセルできます.
このブログの内容は『UNIX環境高度プログラミング』(第2版)から抜粋し、個人学習記録としてのみ使用されている.本書については、http://www.apuebook.com/を参照してください.