pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np - cancelability
type
を保持したままでスレッドのキャンセルクリーンアップハンドラの
push/pop を行う
#include <pthread.h>
void pthread_cleanup_push_defer_np(void (*routine)(void *),
void *arg);
void pthread_cleanup_pop_restore_np(int execute);
-pthread
を付けてコンパイルとリンクを行う。
これらの関数は
pthread_cleanup_push(3) と
pthread_cleanup_pop(3)
と同じだが、このページで説明する点が異なる。
pthread_cleanup_push(3) と同様に、
pthread_cleanup_push_defer_np() は
routine
をそのスレッドの
クリーンアップハンドラのスタックに追加する。これに加えて、
pthread_cleanup_push_defer_np() は現在の
cancelability type も 保存し、cancelability type
は "deferred" に設定する (
pthread_setcanceltype(3) 参照)。
これにより、この関数が呼び出される前のスレッドの
cancelability type が "asynchronous"
であったとしても、キャンセルクリーンアップが行われること
が保証される。
pthread_cleanup_pop(3) と同様に、
pthread_cleanup_pop_restore_np()
はそのスレッドのキャンセル
クリーンアップハンドラのスタックから一番上にあるクリーンアップハンドラ
を取り出す。これに加えて、そのスレッドの
cancelability type を、対応 する
pthread_cleanup_push_defer_np()
が呼ばれた時点の値に戻す。
呼び出し側では、これらの関数の呼び出しが同じ関数の中で対となり、かつ
文法的に同じネストレベル
(nesting level)
になることを保証しなければ
ならない。
pthread_cleanup_push(3)
で説明されている他の制限も
適用される。
以下の一連の呼び出し
pthread_cleanup_push_defer_np(routine, arg);
pthread_cleanup_pop_restore_np(execute);
と以下は等価である
(但し、上の方がより簡潔で効率的である)。
int oldtype;
pthread_cleanup_push(routine, arg);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
...
pthread_setcanceltype(oldtype, NULL);
pthread_cleanup_pop(execute);
これらの関数は非標準の
GNU による拡張である。
そのため、名前に
"_np" (nonportable;
移植性がない)
という接尾辞が
付いている。
関連項目¶
pthread_cancel(3),
pthread_cleanup_push(3),
pthread_setcancelstate(3),
pthread_testcancel(3),
pthreads(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。