pthread_cleanup_push

Autres langues

Langue: ja

Autres versions - même langue

Version: LinuxThreads (openSuse - 09/10/07)

Section: 3 (Bibliothèques de fonctions)

̾Á°

pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np - ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤ª¤è¤Óºï½ü¤¹¤ë

½ñ¼°

#include <pthread.h>

void pthread_cleanup_push(void (*routine) (void *), void *arg);

void pthread_cleanup_pop(int execute);

void pthread_cleanup_push_defer_np(void (*routine) (void *), void *arg);

void pthread_cleanup_pop_restore_np(int execute);

ÀâÌÀ

¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï¡¢ pthread_exit(3) ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤ê¡¢¼è¤ê¾Ã¤·¤µ¤ì¤¿¤ê¤·¤Æ ¥¹¥ì¥Ã¥É¤¬½ªÎ»¤¹¤ë¤È¤­¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô¤Ç¤¢¤ë¡£ ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï ¥¹¥¿¥Ã¥¯É÷¤Îµ¬Â§¤Ë¤Ê¤é¤Ã¤ÆÅÐÏ¿¤ª¤è¤Óºï½ü¤µ¤ì¤ë¡£

¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤ÎÌÜŪ¤Ï¡¢ ¥¹¥ì¥Ã¥É¤¬½ªÎ»¤¹¤ë¤È¤­¤ËÊÝ»ý¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤»ñ¸»¤ò ²òÊü¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ ¼ì¤Ë¡¢¥¹¥ì¥Ã¥É¤¬¥í¥Ã¥¯Ãæ¤Î mutex ¤òÊÝ»ý¤·¤¿¤Þ¤Þ ½ªÎ»¤·¤¿¤ê¼è¤ê¾Ã¤·¤µ¤ì¤¿¤ê¤¹¤ë¤È¡¢ ¤½¤Î mutex ¤Ï±Êµ×¤Ë¥í¥Ã¥¯¤µ¤ì¤¿¤Þ¤Þ¤Ç¡¢ ¤Û¤«¤Î¥¹¥ì¥Ã¥É¤¬Àµ¾ï¤Ë¼Â¹Ô¤Ç¤­¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£ ¤³¤Î¤³¤È¤òËɤ°ºÇ¤â¤è¤¤ÊýË¡¤Ï¡¢ mutex ¤ò¥í¥Ã¥¯¤¹¤ëľÁ°¤Ë¡¢ mutex ¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤¿¤á¤Î ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ Ʊ¤¸¤è¤¦¤Ë¡¢¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï ¥¹¥ì¥Ã¥É¤Î½ªÎ»»þ¤Ë malloc(3) ¤Ç³ÎÊݤµ¤ì¤¿¥á¥â¥ê¥Ö¥í¥Ã¥¯¤ò²òÊü¤·¤¿¤ê ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¡¼¤ò¥¯¥í¡¼¥º¤·¤¿¤ê¤¹¤ë¤Î¤Ë»ÈÍѤǤ­¤ë¡£

pthread_cleanup_push ¤Ï´Ø¿ô routine ¤ò°ú¿ô arg ¤È¤È¤â¤Ë¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤È¤·¤ÆÅÐÏ¿¤¹¤ë¡£ ¤³¤Î»þÅÀ¤«¤é Âбþ¤¹¤ë pthread_cleanup_pop ¤Þ¤Ç¤Î´Ö¡¢ ¤½¤Î¥¹¥ì¥Ã¥É¤¬ pthread_exit(3) ¤Þ¤¿¤Ï¼è¤ê¾Ã¤·¤Ë¤è¤Ã¤Æ½ªÎ»¤¹¤ë»þ¤Ë¡¢ ´Ø¿ô routine ¤¬°ú¿ô arg ¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡£ ½ªÎ»¤¹¤ë»þÅÀ¤ÇÊ£¿ô¤Î¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤Ï LIFO ½ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë: ¤¹¤Ê¤ï¤Á¡¢ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿¥Ï¥ó¥É¥é¤¬ºÇ½é¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¡£

pthread_cleanup_pop ¤Ï¡¢ºÇ¸å¤ËÅÐÏ¿¤µ¤ì¤¿¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òºï½ü¤¹¤ë¡£ °ú¿ô execute ¤¬ 0 ¤Ç¤Ê¤¤¾ì¹ç¡¢ pthread_cleanup_pop ¤Ï¥Ï¥ó¥É¥é¤ò¼Â¹Ô¤¹¤ë¡£ ¤¹¤Ê¤ï¤Á¡¢ ´Ø¿ô routine ¤ò°ú¿ô arg ¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ¤Ó½Ð¤¹¡£ °ú¿ô execute ¤¬ 0 ¤Î¾ì¹ç¤Ï¡¢¥Ï¥ó¥É¥é¤¬ºï½ü¤µ¤ì¤ë¤À¤±¤Ç¡¢¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¡£

Âбþ¤¹¤ë pthread_cleanup_push ¤È pthread_cleanup_pop ¤ÎÂФϡ¢Æ±¤¸´Ø¿ôÆâ¤Î¡¢ Ʊ¤¸¥Ö¥í¥Ã¥¯³¬Áؤˤʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ ¼ÂºÝ¡¢ pthread_cleanup_push ¤È pthread_cleanup_pop ¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢ pthread_cleanup_push ¤Î¥Þ¥¯¥íŸ³«¤Ë¤Ï ³«¤­³ç¸Ì { ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢¤½¤ì¤ËÂбþ¤¹¤ë ÊĤ¸³ç¸Ì } ¤Ï¡¢Âбþ¤¹¤ë pthread_cleanup_pop ¤Î¥Þ¥¯¥íŸ³«¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡£

pthread_cleanup_push_defer_np ¤Ï¡¢ pthread_cleanup_push ¤È pthread_setcanceltype(3) ¤òÁȤ߹ç¤ï¤»¤¿¡¢¥Ý¡¼¥¿¥Ö¥ë¤Ç¤Ê¤¤³ÈÄ¥¤Ç¤¢¤ë¡£ pthread_cleanup_push ¤È¤Þ¤Ã¤¿¤¯Æ±¤¸¤è¤¦¤Ë¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òÅÐÏ¿¤¹¤ë¤¬¡¢ Ʊ»þ¤Ë¤½¤Î»þÅÀ¤Î¼è¤ê¾Ã¤··¿¤òÊݸ¤·¡¢ ¼è¤ê¾Ã¤··¿¤òÃÙ±ä (deferred) ¤ËÊѹ¹¤¹¤ë¡£ ¤³¤ì¤Ë¤è¤Ã¤Æ¡¢ ¥¹¥ì¥Ã¥É¤Î¼è¤ê¾Ã¤··¿¤¬ÈóƱ´ü (asynchronous) ¤Ç¤¢¤Ã¤Æ¤â ¥¯¥ê¡¼¥ó¥¢¥Ã¥×µ¡¹½¤¬Í­¸ú¤Ë¤Ê¤ë¤³¤È¤¬Êݾڤµ¤ì¤ë¡£

pthread_cleanup_pop_restore_np ¤Ï pthread_cleanup_push_defer_np ¤Ë¤è¤Ã¤ÆÅÐÏ¿¤µ¤ì¤¿¤Ï¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥Ï¥ó¥É¥é¤òºï½ü¤·¡¢ ¼è¤ê¾Ã¤··¿¤ò pthread_cleanup_push_defer_np ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿»þÅÀ¤ÎÃͤËÌ᤹¡£

pthread_cleanup_push_defer_np ¤È pthread_cleanup_pop_restore_np ¤ÏÂФˤʤäƤ¤¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢ ¤È¤â¤ËƱ¤¸¥Ö¥í¥Ã¥¯³¬Áؤˤʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£




pthread_cleanup_push_defer_np(routine, arg);

pthread_cleanup_pop_defer_np(execute);



¤Î¤è¤¦¤Êή¤ì¤Ïµ¡Ç½Åª¤Ë¼¡¤Î¤â¤Î¤ÈƱÅù (¤À¤¬¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ç¤è¤ê¸úΨŪ) ¤Ç¤¢¤ë¡£




{ int oldtype;

  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);

  pthread_cleanup_push(routine, arg);

  ...

  pthread_cleanup_pop(execute);

  pthread_setcanceltype(oldtype, NULL);

}



ÊÖ¤êÃÍ

¤Ê¤·¡£

¥¨¥é¡¼

¤Ê¤·¡£

Ãø¼Ô

Xavier Leroy <Xavier.Leroy@inria.fr>

´ØÏ¢¹àÌÜ

pthread_exit(3), pthread_cancel(3), pthread_setcanceltype(3).

Îã

¼¡¤ÎÎã¤Ï¡¢ mutex mut ¤ò¥í¥Ã¥¯Ãæ¤Ë¥¹¥ì¥Ã¥É¤¬¼è¤ê¾Ã¤·¤µ¤ì¤¿¤é ¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤è¤¦¤Ë¡¢ mutex mut ¤ò¥í¥Ã¥¯¤¹¤ëÊýË¡¤Ç¤¢¤ë:




pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);

pthread_mutex_lock(&mut);

/* ²¿¤«¤ò¤¹¤ë */

pthread_mutex_unlock(&mut);

pthread_cleanup_pop(0);



ºÇ¸å¤Î 2 ¹Ô¤Ï¼¡¤Î¤â¤Î¤ÈƱÅù¤Ç¡¢ÃÖ¤­´¹¤¨¤¬²Äǽ¤Ç¤¢¤ë:




pthread_cleanup_pop(1);



¾å¤Î¥³¡¼¥É¤Ï¼è¤ê¾Ã¤··¿¤¬ÃÙ±ä (deferred) ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤Ã¤Æ °ÂÁ´¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤¹¤ë¤³¤È ( pthread_setcanceltype(3) ¤ò»²¾È ) ¡£ ¼è¤ê¾Ã¤··¿¤¬ÈóƱ´ü (asynchronous) ¤Î¾ì¹ç¤Ë¤Ï¡¢ ¥¹¥ì¥Ã¥É¤Î¼è¤ê¾Ã¤·¤¬ pthread_cleanup_push ¤È pthread_mutex_lock ¤Î´Ö¤ä¡¢ pthread_mutex_unlock ¤È pthread_cleanup_pop ¤Î´Ö¤Çµ¯¤³¤ë²ÄǽÀ­¤¬¤¢¤ê¡¢ ¤É¤Á¤é¤Î¾ì¹ç¤Ë¤â¥¹¥ì¥Ã¥É¤Ï¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤Ç ¥í¥Ã¥¯¤·¤Æ¤¤¤Ê¤¤ mutex ¤ò¥í¥Ã¥¯²ò½ü¤·¤è¤¦¤È¤·¤Æ¤·¤Þ¤¦¡£ ¤³¤Î¤³¤È¤ÏÈóƱ´ü¼è¤ê¾Ã¤·¤¬»È¤¤¤Ë¤¯¤¤¤³¤È¤Î¼ç¤ÊÍýͳ¤Ç¤¢¤ë¡£

¾å¤Î¥³¡¼¥É¤¬ÈóƱ´ü¼è¤ê¾Ã¤··¿¤Ç¤âÆ°ºî¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¡¢ mutex ¤Î¥í¥Ã¥¯¤ª¤è¤Ó¥í¥Ã¥¯²ò½ü¤Î¤¿¤á¤Ë¡¢ ¼è¤ê¾Ã¤··¿¤òÃÙ±ä (deferred) ¤ËÊѹ¹¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤:




pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);

pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);

pthread_mutex_lock(&mut);

/* do some work */

pthread_cleanup_pop(1);

pthread_setcanceltype(oldtype, NULL);



¾å¤Î¥³¡¼¥É¤Ï¡¢¥Ý¡¼¥¿¥Ö¥ë¤Ç¤Ê¤¤´Ø¿ô pthread_cleanup_push_defer_np ¤È pthread_cleanup_pop_restore_np ¤ò»È¤¦¤³¤È¤Ç¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ç¤è¤ê¸úΨŪ¤ÊÊýË¡¤Ë½ñ¤­Ä¾¤¹¤³¤È¤¬¤Ç¤­¤ë:




pthread_cleanup_push_restore_np(pthread_mutex_unlock, (void *) &mut);

pthread_mutex_lock(&mut);

/* do some work */

pthread_cleanup_pop_restore_np(1);