.TH PTHREAD_CLEANUP_PUSH 3 2008\-11\-24 Linux "Linux Programmer's Manual"
.SH 名前
pthread_cleanup_push, pthread_cleanup_pop \- スレッドの
-キャンセルクリーンアップハンドラの push/pop を行う
+ã\82ã\83£ã\83³ã\82»ã\83«ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81® push/pop ã\82\92è¡\8cã\81\86
.SH 書式
.nf
\fB#include <pthread.h>\fP
.fi
.SH 説明
これらの関数は、呼び出したスレッドのスレッドキャンセル時のクリーンアッ
-ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\81®ã\82¹ã\82¿ã\83\83ã\82¯ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86ã\80\82ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©は、スレッドが
+ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81®ã\82¹ã\82¿ã\83\83ã\82¯ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86ã\80\82ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼は、スレッドが
キャンセルされた場合 (や以下で説明する他の種々の状況において) 自動的に
実行される関数である。例えば、mutex のロック解除を行い、プロセス内の
他のスレッドが利用できるようにする関数などが考えられる。
\fBpthread_cleanup_push\fP() 関数は、 \fIroutine\fP をクリーンアップ
-ハンドラのスタックの一番上にプッシュする。 \fIroutine\fP が後で
+ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81®ã\82¹ã\82¿ã\83\83ã\82¯ã\81®ä¸\80ç\95ªä¸\8aã\81«ã\83\97ã\83\83ã\82·ã\83¥ã\81\99ã\82\8bã\80\82 \fIroutine\fP ã\81\8cå¾\8cã\81§
起動される際には、 \fIarg\fP が関数の引き数と渡される。
-\fBpthread_cleanup_pop\fP() 関数は、クリーンアップハンドラの
+\fBpthread_cleanup_pop\fP() é\96¢æ\95°ã\81¯ã\80\81ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81®
スタックの一番上のルーチンを削除する。
\fIexecute\fP が 0 以外の場合にはそのルーチンを追加で実行する。
-キャンセルクリーンアップハンドラは、以下に示す場合に
+ã\82ã\83£ã\83³ã\82»ã\83«ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¯ã\80\81以ä¸\8bã\81«ç¤ºã\81\99å ´å\90\88ã\81«
スタックから取り出され実行される。
.IP 1. 3
スレッドがキャンセルされた際に、スタックに登録された全てのクリーン
-ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\81\8cå\8f\96ã\82\8aå\87ºã\81\95ã\82\8cã\81¦ã\80\81å®\9fè¡\8cã\81\95ã\82\8cã\82\8bã\80\82ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©の
+ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8cå\8f\96ã\82\8aå\87ºã\81\95ã\82\8cã\81¦ã\80\81å®\9fè¡\8cã\81\95ã\82\8cã\82\8bã\80\82ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼の
実行は、スタックに登録されたのと逆の順序で行われる。
.IP 2.
スレッドが \fBpthread_exit\fP(3) を呼び出して終了する際に、全てのクリーン
-アップハンドラが上の項目で述べたのと同様に実行される。
+ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8cä¸\8aã\81®é \85ç\9b®ã\81§è¿°ã\81¹ã\81\9fã\81®ã\81¨å\90\8cæ§\98ã\81«å®\9fè¡\8cã\81\95ã\82\8cã\82\8bã\80\82
(スレッドがスレッド開始関数からの \fIreturn\fP の実行により終了する場合に
-は、クリーンアップハンドラは\fI呼び出されない\fP。)
+ã\81¯ã\80\81ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¯\fIå\91¼ã\81³å\87ºã\81\95ã\82\8cã\81ªã\81\84\fPã\80\82)
.IP 3.
スレッドが 0 以外の \fIexecute\fP 引き数で \fBpthread_cleanup_pop\fP() を
-呼び出した際に、スタックの一番上のクリーンアップハンドラが取り出されて
+å\91¼ã\81³å\87ºã\81\97ã\81\9fé\9a\9bã\81«ã\80\81ã\82¹ã\82¿ã\83\83ã\82¯ã\81®ä¸\80ç\95ªä¸\8aã\81®ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8cå\8f\96ã\82\8aå\87ºã\81\95ã\82\8cã\81¦
実行される。
.PP
POSIX.1 では、 \fBpthread_cleanup_push\fP() と \fBpthread_cleanup_pop\fP() を
して実装することを許容している。
このため、呼び出し側では、これらの関数の呼び出しが同じ関数の中で対と
なり、かつ文法的に同じネストレベル (nesting level) になることを保証
-しなければならない。 (言い換えると、クリーンアップハンドラは、コード
+ã\81\97ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\80\82 (è¨\80ã\81\84æ\8f\9bã\81\88ã\82\8bã\81¨ã\80\81ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¯ã\80\81ã\82³ã\83¼ã\83\89
の特定のセクションの実行の中でのみ設定するものであると言える。)
\fBlongjmp\fP(3) (\fBsiglongjmp\fP(3)) の呼び出しは、
\fBpthread_cleanup_push\fP() や \fBpthread_cleanup_pop\fP() の呼び出しが対と
なる呼び出しがない状態で行われた場合には、どのような結果になるかは不定
-である。これは jump バッファは \fBsetjmp\fP(3) (\fBsigsetjmp\fP(3)) により設
-定されるからである。同様に、クリーンアップハンドラ内からの
-\fBlongjmp\fP(3) (\fBsiglongjmp\fP(3)) ã\81®å\91¼ã\81³å\87ºã\81\97ã\82\82ã\80\81jump ã\83\90ã\83\83ã\83\95ã\82¡ã\81\8cã\83\8fã\83³ã\83\89ã\83©
+ã\81§ã\81\82ã\82\8bã\80\82ã\81\93ã\82\8cã\81¯ jump ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81¯ \fBsetjmp\fP(3) (\fBsigsetjmp\fP(3)) ã\81«ã\82\88ã\82\8aè¨
+定されるからである。同様に、クリーンアップハンドラー内からの
+\fBlongjmp\fP(3) (\fBsiglongjmp\fP(3)) ã\81®å\91¼ã\81³å\87ºã\81\97ã\82\82ã\80\81jump ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81\8cã\83\8fã\83³ã\83\89ã\83©ã\83¼
内で \fBsetjmp\fP(3) (\fBsigsetjmp\fP(3)) で設定されていない限り、どのような
結果になるかは不定である。
.SH 返り値
.in
上記の実行例から、スレッドがキャンセルされ、
-キャンセルクリーンアップハンドラが呼び出され、
+ã\82ã\83£ã\83³ã\82»ã\83«ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8cå\91¼ã\81³å\87ºã\81\95ã\82\8cã\80\81
グローバル変数 \fIcnt\fP の値が 0 にリセットされていることが確認できる。
次の実行例では、メインプログラムはグローバル変数を設定して、
.fi
.in
-上記では、 (\fIcleanup_pop_arg\fP が 0 なので) クリーンアップハンドラは
+ä¸\8aè¨\98ã\81§ã\81¯ã\80\81 (\fIcleanup_pop_arg\fP ã\81\8c 0 ã\81ªã\81®ã\81§) ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¯
実行されておらず、その結果 \fIcnt\fP の値はリセットされていないことが
分かる。
.fi
.in
-上記では、スレッドはキャンセルされていないが、クリーンアップハンドラが
+ä¸\8aè¨\98ã\81§ã\81¯ã\80\81ã\82¹ã\83¬ã\83\83ã\83\89ã\81¯ã\82ã\83£ã\83³ã\82»ã\83«ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\81\8cã\80\81ã\82¯ã\83ªã\83¼ã\83³ã\82¢ã\83\83ã\83\97ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8c
実行されていないことが分かる。これは \fBpthread_cleanup_pop\fP() の引き数
に 0 以外を渡したからである。
.SS プログラムのソース