.\" Translated Tue Dec 31 21:07:33 JST 2002
.\" by Suzuki Takashi.
.\"
-.\"WORD: cleanup handler ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é
-.\"WORD: cancellation ¼è¤ê¾Ã¤·
-.\"WORD: stack-like ¥¹¥¿¥Ã¥¯É÷¤Î
-.\"WORD: non-portable extension ¥Ý¡¼¥¿¥Ö¥ë¤Ç¤Ê¤¤³ÈÄ¥
-.\"WORD: cancellation type ¼è¤ê¾Ã¤··¿
-.\"WORD: deferred ¡Ê¼è¤ê¾Ã¤··¿¤Î¡ËÃÙ±ä
-.\"WORD: asynchronous ¡Ê¼è¤ê¾Ã¤··¿¤Î¡ËÈóƱ´ü
-.\"WORD: cancellation mode ¼è¤ê¾Ã¤··¿
+.\"WORD: cleanup handler クリーンアップハンドラ
+.\"WORD: cancellation 取り消し
+.\"WORD: stack-like スタック風の
+.\"WORD: non-portable extension ポータブルでない拡張
+.\"WORD: cancellation type 取り消し型
+.\"WORD: deferred (取り消し型の)遅延
+.\"WORD: asynchronous (取り消し型の)非同期
+.\"WORD: cancellation mode 取り消し型
.\"
.\"
.TH PTHREAD_CLEANUP 3 LinuxThreads
.\"O .SH NAME
-.SH ̾Á°
+.SH 名前
.\"O pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np
.\"O \- install and remove cleanup handlers
pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np
-\- ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤ª¤è¤Óºï½ü¤¹¤ë
+\- クリーンアップハンドラを登録および削除する
.\"O .SH SYNOPSIS
-.SH ½ñ¼°
+.SH 書式
.B #include <pthread.h>
.BI "void pthread_cleanup_push(void (*" routine ") (void *), void *" arg ");"
.BI "void pthread_cleanup_pop_restore_np(int " execute ");"
.\"O .SH DESCRIPTION
-.SH "ÀâÌÀ"
+.SH "説明"
.\"O Cleanup handlers are functions that get called when a thread
.\"O terminates, either by calling
.\"O or because of
.\"O cancellation. Cleanup handlers are installed and removed following a
.\"O stack-like discipline.
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï¡¢
+クリーンアップハンドラは、
.BR "pthread_exit" (3)
-¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤ê¡¢¼è¤ê¾Ã¤·¤µ¤ì¤¿¤ê¤·¤Æ
-¥¹¥ì¥Ã¥É¤¬½ªÎ»¤¹¤ë¤È¤¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï
-¥¹¥¿¥Ã¥¯É÷¤Îµ¬Â§¤Ë¤Ê¤é¤Ã¤ÆÅÐÏ¿¤ª¤è¤Óºï½ü¤µ¤ì¤ë¡£
+が呼び出されたり、取り消しされたりして
+スレッドが終了するときに呼び出される関数である。
+クリーンアップハンドラは
+スタック風の規則にならって登録および削除される。
.\"O The purpose of cleanup handlers is to free the resources that a thread
.\"O may hold at the time it terminates. In particular, if a thread
.\"O with
.\"O .BR "malloc" (3)
.\"O or close file descriptors on thread termination.
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤ÎÌÜŪ¤Ï¡¢
-¥¹¥ì¥Ã¥É¤¬½ªÎ»¤¹¤ë¤È¤¤ËÊÝ»ý¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤»ñ¸»¤ò
-²òÊü¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£
-¼ì¤Ë¡¢¥¹¥ì¥Ã¥É¤¬¥í¥Ã¥¯Ãæ¤Î mutex ¤òÊÝ»ý¤·¤¿¤Þ¤Þ
-½ªÎ»¤·¤¿¤ê¼è¤ê¾Ã¤·¤µ¤ì¤¿¤ê¤¹¤ë¤È¡¢
-¤½¤Î mutex ¤Ï±Êµ×¤Ë¥í¥Ã¥¯¤µ¤ì¤¿¤Þ¤Þ¤Ç¡¢
-¤Û¤«¤Î¥¹¥ì¥Ã¥É¤¬Àµ¾ï¤Ë¼Â¹Ô¤Ç¤¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£
-¤³¤Î¤³¤È¤òËɤ°ºÇ¤â¤è¤¤ÊýË¡¤Ï¡¢
-mutex ¤ò¥í¥Ã¥¯¤¹¤ëľÁ°¤Ë¡¢
-mutex ¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤¿¤á¤Î
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£
-Ʊ¤¸¤è¤¦¤Ë¡¢¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï
-¥¹¥ì¥Ã¥É¤Î½ªÎ»»þ¤Ë
+クリーンアップハンドラの目的は、
+スレッドが終了するときに保持しているかもしれない資源を
+解放することである。
+殊に、スレッドがロック中の mutex を保持したまま
+終了したり取り消しされたりすると、
+その mutex は永久にロックされたままで、
+ほかのスレッドが正常に実行できなくなってしまう。
+このことを防ぐ最もよい方法は、
+mutex をロックする直前に、
+mutex のロックを解除するための
+クリーンアップハンドラを登録することである。
+同じように、クリーンアップハンドラは
+スレッドの終了時に
.BR "malloc" (3)
-¤Ç³ÎÊݤµ¤ì¤¿¥á¥â¥ê¥Ö¥í¥Ã¥¯¤ò²òÊü¤·¤¿¤ê
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¡¼¤ò¥¯¥í¡¼¥º¤·¤¿¤ê¤¹¤ë¤Î¤Ë»ÈÍѤǤ¤ë¡£
+で確保されたメモリブロックを解放したり
+ファイルディスクリプターをクローズしたりするのに使用できる。
.\"O .B "pthread_cleanup_push"
.\"O installs the
.\"O point, they are called in LIFO order: the most recently installed
.\"O handler is called first.
.B "pthread_cleanup_push"
-¤Ï´Ø¿ô
+は関数
.I "routine"
-¤ò°ú¿ô
+を引数
.I "arg"
-¤È¤È¤â¤Ë¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤È¤·¤ÆÅÐÏ¿¤¹¤ë¡£
-¤³¤Î»þÅÀ¤«¤é
-Âбþ¤¹¤ë
+とともにクリーンアップハンドラとして登録する。
+この時点から
+対応する
.B "pthread_cleanup_pop"
-¤Þ¤Ç¤Î´Ö¡¢
-¤½¤Î¥¹¥ì¥Ã¥É¤¬
+までの間、
+そのスレッドが
.BR "pthread_exit" (3)
-¤Þ¤¿¤Ï¼è¤ê¾Ã¤·¤Ë¤è¤Ã¤Æ½ªÎ»¤¹¤ë»þ¤Ë¡¢
-´Ø¿ô
+または取り消しによって終了する時に、
+関数
.I "routine"
-¤¬°ú¿ô
+が引数
.I "arg"
-¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡£
-½ªÎ»¤¹¤ë»þÅÀ¤ÇÊ£¿ô¤Î¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï LIFO ½ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë:
-¤¹¤Ê¤ï¤Á¡¢ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿¥Ï¥ó¥É¥é¤¬ºÇ½é¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¡£
+をともなって呼び出されるようになる。
+終了する時点で複数のクリーンアップハンドラが有効になっている場合は、
+クリーンアップハンドラは LIFO 順に呼び出される:
+すなわち、最後に登録されたハンドラが最初に呼び出される。
.\"O .B "pthread_cleanup_pop"
.\"O removes the most recently installed cleanup
.\"O argument is 0, the handler is only removed but not
.\"O executed.
.B "pthread_cleanup_pop"
-¤Ï¡¢ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òºï½ü¤¹¤ë¡£
-°ú¿ô
+は、最後に登録されたクリーンアップハンドラを削除する。
+引数
.I "execute"
-¤¬ 0 ¤Ç¤Ê¤¤¾ì¹ç¡¢
+が 0 でない場合、
.B "pthread_cleanup_pop"
-¤Ï¥Ï¥ó¥É¥é¤ò¼Â¹Ô¤¹¤ë¡£
-¤¹¤Ê¤ï¤Á¡¢
-´Ø¿ô
+はハンドラを実行する。
+すなわち、
+関数
.I "routine"
-¤ò°ú¿ô
+を引数
.I "arg"
-¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ¤Ó½Ð¤¹¡£
-°ú¿ô
+をともなって呼び出す。
+引数
.I "execute"
-¤¬ 0 ¤Î¾ì¹ç¤Ï¡¢¥Ï¥ó¥É¥é¤¬ºï½ü¤µ¤ì¤ë¤À¤±¤Ç¡¢¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¡£
+が 0 の場合は、ハンドラが削除されるだけで、実行されることはない。
.\"O Matching pairs of
.\"O .B "pthread_cleanup_push"
.\"O being introduced by the expansion
.\"O of the matching
.\"O .BR "pthread_cleanup_pop" .
-Âбþ¤¹¤ë
+対応する
.B "pthread_cleanup_push"
-¤È
+と
.B "pthread_cleanup_pop"
-¤ÎÂФϡ¢Æ±¤¸´Ø¿ôÆâ¤Î¡¢
-Ʊ¤¸¥Ö¥í¥Ã¥¯³¬Áؤˤʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
-¼ÂºÝ¡¢
+の対は、同じ関数内の、
+同じブロック階層になければならない。
+実際、
.B "pthread_cleanup_push"
-¤È
+と
.B "pthread_cleanup_pop"
-¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢
+はマクロであり、
.B "pthread_cleanup_push"
-¤Î¥Þ¥¯¥íŸ³«¤Ë¤Ï
-³«¤³ç¸Ì
+のマクロ展開には
+開き括弧
.B "{"
-¤¬´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢¤½¤ì¤ËÂбþ¤¹¤ë
-ÊĤ¸³ç¸Ì
+が含まれていて、それに対応する
+閉じ括弧
.B "}"
-¤Ï¡¢Âбþ¤¹¤ë
+は、対応する
.B "pthread_cleanup_pop"
-¤Î¥Þ¥¯¥íŸ³«¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡£
+のマクロ展開に含まれている。
.\"O .B "pthread_cleanup_push_defer_np"
.\"O is a non-portable extension that
.\"O cancellation. This ensures that the cleanup mechanism is effective
.\"O even if the thread was initially in asynchronous cancellation mode.
.B "pthread_cleanup_push_defer_np"
-¤Ï¡¢
+は、
.B "pthread_cleanup_push"
-¤È
+と
.BR "pthread_setcanceltype" (3)
-¤òÁȤ߹ç¤ï¤»¤¿¡¢¥Ý¡¼¥¿¥Ö¥ë¤Ç¤Ê¤¤³ÈÄ¥¤Ç¤¢¤ë¡£
+を組み合わせた、ポータブルでない拡張である。
.B "pthread_cleanup_push"
-¤È¤Þ¤Ã¤¿¤¯Æ±¤¸¤è¤¦¤Ë¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤¹¤ë¤¬¡¢
-Ʊ»þ¤Ë¤½¤Î»þÅÀ¤Î¼è¤ê¾Ã¤··¿¤òÊݸ¤·¡¢
-¼è¤ê¾Ã¤··¿¤òÃÙ±ä (deferred) ¤ËÊѹ¹¤¹¤ë¡£
-¤³¤ì¤Ë¤è¤Ã¤Æ¡¢
-¥¹¥ì¥Ã¥É¤Î¼è¤ê¾Ã¤··¿¤¬ÈóƱ´ü (asynchronous) ¤Ç¤¢¤Ã¤Æ¤â
-¥¯¥ê¡¼¥ó¥¢¥Ã¥×µ¡¹½¤¬Í¸ú¤Ë¤Ê¤ë¤³¤È¤¬Êݾڤµ¤ì¤ë¡£
+とまったく同じようにクリーンアップハンドラを登録するが、
+同時にその時点の取り消し型を保存し、
+取り消し型を遅延 (deferred) に変更する。
+これによって、
+スレッドの取り消し型が非同期 (asynchronous) であっても
+クリーンアップ機構が有効になることが保証される。
.\"O .B "pthread_cleanup_pop_restore_np"
.\"O pops a cleanup handler introduced by
.\"O .B "pthread_cleanup_push_defer_np"
.\"O was called.
.B "pthread_cleanup_pop_restore_np"
-¤Ï
+は
.B "pthread_cleanup_push_defer_np"
-¤Ë¤è¤Ã¤ÆÅÐÏ¿¤µ¤ì¤¿¤Ï¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òºï½ü¤·¡¢
-¼è¤ê¾Ã¤··¿¤ò
+によって登録されたはクリーンアップハンドラを削除し、
+取り消し型を
.B "pthread_cleanup_push_defer_np"
-¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿»þÅÀ¤ÎÃͤËÌ᤹¡£
+が呼び出された時点の値に戻す。
.\"O .B "pthread_cleanup_push_defer_np"
.\"O and
.\"O .B "pthread_cleanup_pop_restore_np"
.\"O must occur in matching pairs, at the same level of block nesting.
.B "pthread_cleanup_push_defer_np"
-¤È
+と
.B "pthread_cleanup_pop_restore_np"
-¤ÏÂФˤʤäƤ¤¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢
-¤È¤â¤ËƱ¤¸¥Ö¥í¥Ã¥¯³¬Áؤˤʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+は対になっていなければならず、
+ともに同じブロック階層になければならない。
.\"O The following sequence
.fi
.\"O is functionally equivalent to (but more compact and more efficient than)
-¤Î¤è¤¦¤Êή¤ì¤Ïµ¡Ç½Åª¤Ë¼¡¤Î¤â¤Î¤ÈƱÅù (¤À¤¬¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ç¤è¤ê¸úΨŪ) ¤Ç¤¢¤ë¡£
+のような流れは機能的に次のものと同等 (だがよりコンパクトでより効率的) である。
.RS
.ft 3
.fi
.\"O .SH "RETURN VALUE"
-.SH "ÊÖ¤êÃÍ"
+.SH "返り値"
.\"O None.
-¤Ê¤·¡£
+なし。
.\"O .SH ERRORS
-.SH "¥¨¥é¡¼"
+.SH "ã\82¨ã\83©ã\83¼"
.\"O None.
-¤Ê¤·¡£
+なし。
.\"O .SH AUTHOR
-.SH "Ãø¼Ô"
+.SH "著者"
Xavier Leroy <Xavier.Leroy@inria.fr>
.\"O .SH "SEE ALSO"
-.SH "´ØÏ¢¹àÌÜ"
+.SH "関連項目"
.BR "pthread_exit" (3),
.BR "pthread_cancel" (3),
.BR "pthread_setcanceltype" (3).
.\"O .SH EXAMPLE
-.SH "Îã"
+.SH "例"
.\"O Here is how to lock a mutex
.\"O .I "mut"
.\"O unlocked if the thread is canceled while
.\"O .I "mut"
.\"O is locked:
-¼¡¤ÎÎã¤Ï¡¢ mutex
+次の例は、 mutex
.I "mut"
-¤ò¥í¥Ã¥¯Ãæ¤Ë¥¹¥ì¥Ã¥É¤¬¼è¤ê¾Ã¤·¤µ¤ì¤¿¤é
-¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤è¤¦¤Ë¡¢
+をロック中にスレッドが取り消しされたら
+ロックを解除するように、
mutex
.I "mut"
-¤ò¥í¥Ã¥¯¤¹¤ëÊýË¡¤Ç¤¢¤ë:
+をロックする方法である:
.RS
.ft 3
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
pthread_mutex_lock(&mut);
.\"O/* do some work */
-/* ²¿¤«¤ò¤¹¤ë */
+/* 何かをする */
pthread_mutex_unlock(&mut);
pthread_cleanup_pop(0);
.ft
.fi
.\"O Equivalently, the last two lines can be replaced by
-ºÇ¸å¤Î 2 ¹Ô¤Ï¼¡¤Î¤â¤Î¤ÈƱÅù¤Ç¡¢ÃÖ¤´¹¤¨¤¬²Äǽ¤Ç¤¢¤ë:
+最後の 2 行は次のものと同等で、置き換えが可能である:
.RS
.ft 3
.\"O resulting in both cases in the thread trying to
.\"O unlock a mutex not locked by the current thread. This is the main
.\"O reason why asynchronous cancellation is difficult to use.
-¾å¤Î¥³¡¼¥É¤Ï¼è¤ê¾Ã¤··¿¤¬ÃÙ±ä (deferred) ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤Ã¤Æ
-°ÂÁ´¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤¹¤ë¤³¤È (
+上のコードは取り消し型が遅延 (deferred) である場合に限って
+安全であることに注意すること (
.BR "pthread_setcanceltype" (3)
-¤ò»²¾È ) ¡£
-¼è¤ê¾Ã¤··¿¤¬ÈóƱ´ü (asynchronous) ¤Î¾ì¹ç¤Ë¤Ï¡¢
-¥¹¥ì¥Ã¥É¤Î¼è¤ê¾Ã¤·¤¬
+を参照 ) 。
+取り消し型が非同期 (asynchronous) の場合には、
+スレッドの取り消しが
.B "pthread_cleanup_push"
-¤È
+と
.B "pthread_mutex_lock"
-¤Î´Ö¤ä¡¢
+の間や、
.B "pthread_mutex_unlock"
-¤È
+と
.B "pthread_cleanup_pop"
-¤Î´Ö¤Çµ¯¤³¤ë²ÄǽÀ¤¬¤¢¤ê¡¢
-¤É¤Á¤é¤Î¾ì¹ç¤Ë¤â¥¹¥ì¥Ã¥É¤Ï¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤Ç
-¥í¥Ã¥¯¤·¤Æ¤¤¤Ê¤¤ mutex ¤ò¥í¥Ã¥¯²ò½ü¤·¤è¤¦¤È¤·¤Æ¤·¤Þ¤¦¡£
-¤³¤Î¤³¤È¤ÏÈóƱ´ü¼è¤ê¾Ã¤·¤¬»È¤¤¤Ë¤¯¤¤¤³¤È¤Î¼ç¤ÊÍýͳ¤Ç¤¢¤ë¡£
+の間で起こる可能性があり、
+どちらの場合にもスレッドはカレントスレッドで
+ロックしていない mutex をロック解除しようとしてしまう。
+このことは非同期取り消しが使いにくいことの主な理由である。
.\"O If the code above must also work in asynchronous cancellation mode,
.\"O then it must switch to deferred mode for locking and unlocking the
.\"O mutex:
-¾å¤Î¥³¡¼¥É¤¬ÈóƱ´ü¼è¤ê¾Ã¤··¿¤Ç¤âÆ°ºî¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¡¢
-mutex ¤Î¥í¥Ã¥¯¤ª¤è¤Ó¥í¥Ã¥¯²ò½ü¤Î¤¿¤á¤Ë¡¢
-¼è¤ê¾Ã¤··¿¤òÃÙ±ä (deferred) ¤ËÊѹ¹¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤:
+上のコードが非同期取り消し型でも動作しなければならない場合、
+mutex のロックおよびロック解除のために、
+取り消し型を遅延 (deferred) に変更しなければならない:
.RS
.ft 3
.\"O .B "pthread_cleanup_push_defer_np"
.\"O and
.\"O .BR "pthread_cleanup_pop_restore_np" :
-¾å¤Î¥³¡¼¥É¤Ï¡¢¥Ý¡¼¥¿¥Ö¥ë¤Ç¤Ê¤¤´Ø¿ô
+上のコードは、ポータブルでない関数
.B "pthread_cleanup_push_defer_np"
-¤È
+と
.B "pthread_cleanup_pop_restore_np"
-¤ò»È¤¦¤³¤È¤Ç¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ç¤è¤ê¸úΨŪ¤ÊÊýË¡¤Ë½ñ¤Ä¾¤¹¤³¤È¤¬¤Ç¤¤ë:
+を使うことで、よりコンパクトでより効率的な方法に書き直すことができる:
.RS
.ft 3