EN JA
PTHREAD_TESTCANCEL(3)
PTHREAD_TESTCANCEL(3) FreeBSD Library Functions Manual PTHREAD_TESTCANCEL(3)

名称

pthread_setcancelstate, pthread_setcanceltype, pthread_testcancelケーパビリティ状態を設定する

ライブラリ

POSIX Threads Library (libpthread, -lpthread)

書式

#include < pthread.h>

int
pthread_setcancelstate( int state, int *oldstate);

int
pthread_setcanceltype( int type, int *oldtype);

void
pthread_testcancel( void);

解説

pthread_setcancelstate() 関数は、呼び出しスレッドのケーパビリティ状態を示された state に不可分に設定し、 oldstateNULL でないなら、 oldstate によって参照される位置に、以前のケーパビリティ状態を返します。 state のための正当な値は、 PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLE です。

pthread_setcanceltype() 関数は、呼び出しスレッドのケーパビリティタイプを示された type に不可分に設定し、 oldtypeNULL でないなら、 oldtype によって参照される位置に、以前のケーパビリティタイプを返します。 type のための正当な値は、 PTHREAD_CANCEL_DEFERREDPTHREAD_CANCEL_ASYNCHRONOUS です。

main() が最初に呼び出されたスレッドを含む、任意の新しく作成されたスレッドのキャンセル (取り消し) 可能性状態とタイプは、それぞれ PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DEFERRED です。

pthread_testcancel() 関数は、呼び出しスレッドでキャンセルポイントを作成します。キャンセル可能性が無効になるなら、 pthread_testcancel() 関数には、影響がありません。

キャンセル (取り消し) 可能性状態

スレッドのキャンセル可能性状態は、キャンセル要求の受領でとられる行動を決定します。スレッドは、多くの方法でキャンセルを制御できます。

各スレッドは、2 つのビットでコード化されるそれ自身の“キャンセル (取り消し) 可能性状態”を維持します。

キャンセル (取り消し) 可能性有効
 
キャンセル可能性が PTHREAD_CANCEL_DISABLE であるとき、ターゲットのスレッドに対するキャンセル要求は、保留中 (pending) として保持されます。
キャンセル (取り消し) 可能性タイプ
 
キャンセル可能性が有効とされ、キャンセル可能性タイプが PTHREAD_CANCEL_ASYNCHRONOUS であるとき、新しいか、または保留中のキャンセル要求は、いつでも作動されます。キャンセル可能性が有効とされ、キャンセル可能性タイプが PTHREAD_CANCEL_DEFERRED であるとき、キャンセルポイント (以下を参照) が到達するまで、キャンセル要求は、保留中として保持されます。キャンセル可能性が無効になるなら、キャンセル要求がすべて保留中で保持されるとともに、キャンセル可能性タイプの設定は、直ちに影響はありません。しかしながら、一度、キャンセル可能性は、再び有効になります、新しいタイプは、影響があるでしょう。

キャンセル (取り消し) ポイント

スレッドが次の関数を実行している時、キャンセルポイントが生じます: accept(), accept4(), aio_suspend(), connect(), close(), creat(), fsync(), mq_receive(), mq_send(), mq_timedreceive(), mq_timedsend(), msync(), nanosleep(), open(), openat(), pause(), poll(), pselect(), pthread_cond_timedwait(), pthread_cond_wait(), pthread_join(), pthread_testcancel(), read(), readv(), recv(), recvfrom(), recvmsg(), select(), sem_timedwait(), sem_wait(), send(), sendmsg(), sendto(), sigsuspend(), sigtimedwait(), sigwaitinfo(), sigwait(), sleep(), system(), tcdrain(), usleep(), wait(), wait3(), wait4(), waitpid(), write(), writev()。 fcntl() 関数は、 cmdF_SETLKW であるなら、キャンセルポイントです。

戻り値

成功するなら、 pthread_setcancelstate() と pthread_setcanceltype() 関数は、0 を返します。そうでなければ、エラーを示すためにエラー番号を返します。

pthread_setcancelstate() と pthread_setcanceltype() 関数は、スレッドが非同期にキャンセルされるかもしれないポイントを制御するために使用されます。キャンセル制御がモジュール化方法で使用可能なために、いくつかの規則が続かなければなりません。

この議論の目的のために、オブジェクトを手続きの一般化であると考えてください。それは、1 ユニットとして書かれ、オブジェクトによって知られていないクライアントによって呼ばれた 1 セットの手続きおよびグローバル変数です。オブジェクトは、他のオブジェクトに依存するかもしれません。

最初に、キャンセル可能性は、明示的に利用可能にされなかったオブジェクトのエントリで単に無効になるべきです。オブジェクトからの出口においては、キャンセル可能性状態が、オブジェクトのエントリのその値に常に戻されるべきです。

これは、モジュール引数から続きます。オブジェクト (あるいはそのオブジェクトを使用するオブジェクトのクライアント) のクライアントが、無効にされたキャンセル可能性があるなら、それは、クライアントが、スレッドがアクションのあるシーケンスを実行する間にキャンセルされるなら、クリーンアップする方法について心配したくないからです。オブジェクトがそのような状態で呼ばれ、それがキャンセル可能性を有効にする、また、キャンセル要求がそのスレッドには保留中であるなら、スレッドは、無効にしたクライアントの希望に反してキャンセルされるでしょう。

2 番目に、キャンセル可能性タイプは、オブジェクトへのエントリで deferred または asynchronous だったことを明示的に設定できます。しかし、キャンセル可能性状態でのように、オブジェクトからの出口においては、そのキャンセル可能性タイプは、オブジェクトへのエントリのその値に常に戻されるべきです。

最後に、非同期にキャンセル可能であるスレッドからキャンセルセーフな関数だけを、呼び出すことができます。

エラー

関数 pthread_setcancelstate() は、次の場合に失敗します:
[ EINVAL]
指定された状態が、 PTHREAD_CANCEL_ENABLE または PTHREAD_CANCEL_DISABLE ではありません。

関数 pthread_setcanceltype() は、次の場合に失敗します:

[ EINVAL]
指定された状態が、 PTHREAD_CANCEL_DEFERRED または PTHREAD_CANCEL_ASYNCHRONOUS ではありません。

関連項目

pthread_cancel(3)

規格

pthread_testcancel() 関数は、 ISO/IEC 9945-1:1996 (“POSIX.1”) に適合しています。標準によって、実装は、さらに多くの関数のキャンセルポイントを作ることができます。

作者

このマニュアルページは、 pthread_cancel(3)OpenBSD の実装のために David Leonard <d@openbsd.org>によって書かれました。
June 11, 2013 FreeBSD