ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. pthread_cancel»ç¿ë¹ý#include <pthread.h> int pthread_cancel(pthread_t thread); int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype); void pthread_testcancel(void); ¼³¸í
À̵é ÇÔ¼ö´Â ÇϳªÀÇ ¾²·¹µå¿¡¼ ½ÇÇàÁßÀÎ ´Ù¸¥ ¾²·¹µå¸¦ Á¾·áÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. Á»´õ ±×·²µíÇÏ°Ô ¸»ÇÏÀÚ¸é ´Ù¸¥ ¾²·¹µå¿¡°Ô ¾²·¹µå Ãë¼Ò¸¦ ¿äûÇÏ´Â °Í°ú °ü·ÃµÈ ÀÛ¾îÀ» À§ÇØ »ç¿ëµÈ´Ù. ¾²·¹µå Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ÀÛµ¿ÇÒ·±Áö´Â ¼³Á¤¿¡ ÀÇÁ¸ÀûÀÌ´Ù. ¿äûÀ» ¹ÞÀº ¾²·¹µå´Â °ð¹Ù·Î Á¾·áÇÒ ¼öµµ ÀÖ°í Ãë¼Ò ÁöÁ¡(cancellation point)À» ¹þ¾î³ÈÄ Á¾·áÇÒ ¼öµµ ÀÖ´Ù.
¾²·¹µå°¡ Á¾·á ¿äûÀ» ¹Þ¾Ò´Ù¸é, ÇØ´ç ¾²·¹µå´Â pthread_exit(PTHREAD_CANCELED)¸¦ ¼öÇàÇÑ´Ù. ¶ÇÇÑ ¸ðµç cleanup handlerµµ ¼öÇàÇϸç, thread-specific µ¥ÀÌÅ͸¦ È£ÃâÇÏ°í ¾²·¹µå°¡ Á¾·áµÈ´Ù. Á¾·á½Ã ¸®ÅϵǴ °ªÀº PTHREAD_CANCELEDÀÌ´Ù. ¾²·¹µå Á¾·á¿Í °ü·ÃµÈ ÀÚ¼¼ÇÑ ³»¿ëÀº pthread_exit(3)À» Âü°íÇϱ⠹ٶõ´Ù.
pthread_cancel()Àº ÀÎÀÚ·Î ÁÖ¾îÁø ¾²·¹µå ½Äº°ÀÚ thread¸¦ °¡Áö´Â ¾²·¹µå¿¡°Ô Á¾·á ¿äûÀ» º¸³½´Ù.
pthread_setcancelstate()´Â ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ¾²·¹µðÀÇ Ãë¼Ò »óŸ¦ º¯°æÇϱâ À§Çؼ »ç¿ëµÈ´Ù. Ãë¼Ò»óÅ´ PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLEµÑÁß Çϳª°¡ ÁöÁ¤µÉ ¼ö ÀÖ´Ù. ÀüÀÚ´Â Ãë¼Ò »óŸ¦ Ȱ¼ºÈ ½Ã۱â À§Çؼ ÈÄÀÚ´Â Ãë¼Ò »óŸ¦ ºñȰ¼ºÈ ½Ã۱â À§Çؼ »ç¿ëÇÑ´Ù. Ãë¼Ò»óÅ´ state¸¦ ÅëÇØ¼ ¼³Á¤µÈ´Ù. ÀÌÀüÀÇ Ãë¼Ò»óÅ´ oldstate¸¦ ÅëÇØ¼ ¹Þ¾Æ¿Ã ¼ö ÀÖ´Ù. NULLÀÏ °æ¿ì ¹Þ¾Æ¿ÀÁö ¾Ê°Ô µÈ´Ù.
pthread_setcanceltype()´Â Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ¹ÝÀÀ ÇÒ°ÇÁö(Ãë¼ÒŸÀÔ)¸¦ °áÁ¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. ¹ÝÀÀÀÇ Á¾·ù´Â type¸¦ ÅëÇØ¼ ¼³Á¤ÇÒ¼ö ÀÖ´Ù. PTHREAD_CANCEL_ASYNCHRONOUS¿Í PTHREAD_CANCEL_DEFERRED µÑ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀüÀÚÀÏ °æ¿ì ¹Ù·Î Á¾·áÇϸç, ÈÄÀÚÀÇ °æ¿ì Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö ±â´Ù¸®°Ô µÈ´Ù. oldtype¸¦ ÀÌ¿ëÇØ¼ ÀÌÀü Ãë¼ÒŸÀÔÀ» ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. NULLÀ̶ó¸é ¹Þ¾Æ¿ÀÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼ö´Â ´ç¿¬ÇÏÁö¸¸ Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE ¶ó¸é ÀÇ¹Ì ¾ø´Â ÇÔ¼ö´Ù.
º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì pthread_create()·Î ¸¸µé¾î Áö´Â ¾²·¹µå´Â PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED·Î »óÅ·Π»ý¼ºµÈ´Ù.
Ãë¼ÒÁöÁ¡Àº ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå´Â Ãë¼ÒÁöÁ¡¿¡ ´ë±âÇϰí ÀÖ´Ù°¡ ¹þ¾î³ª¸é Á¾·áÇÏ°Ô µÈ´Ù.
¿¡·¯
pthread_cancel
¿¹Á¦#include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/time.h> // ¾²·¹µå Á¾·á½Ã È£ÃâµÉ ÇÔ¼ö void clean_up(void *); // ¾²·¹µå ÇÔ¼ö void *thread_func(void *); pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t lmu = PTHREAD_MUTEX_INITIALIZER; int main(int argc, char **argv) { pthread_t pt; pthread_create(&pt, NULL, thread_func, NULL); // »ý¼ºµÈ ¾²·¹µå pt¿¡ Ãë¼Ò ¿äûÀ» º¸³½´Ù. pthread_cancel(pt); // 5Ãʸ¦ ½® ÈÄ¿¡ ½Ã±×³ÎÀ» º¸³½´Ù. sleep(5); pthread_cond_signal(&cond); // joinÈÄ Á¾·áÇÑ´Ù. pthread_join(pt, NULL); printf("exit\n"); exit(1); } // ¾²·¹µå Á¾·á½Ã È¿ÃâµÉ ÇÔ¼ö // ¿©±â¿¡ ÀÚ¿øÇØÁ¦·çƾÀ» ÀÔ·ÂÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. void clean_up(void *arg) { printf("Thread cancel Clean_up function\n"); } void *thread_func(void *arg) { // DISABLE »óÅ´Ù. // ¾²·¹µå¿¡ ´ëÇÑ Ãë¼Ò¿äûÀ» ¹«½ÃÇÑ´Ù. pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); // ¾²·¹µå Á¾·á½Ã È£ÃâµÉ ÇÔ¼ö µî·Ï pthread_cleanup_push(clean_up, (void *)NULL); pthread_mutex_lock(&lmu); printf("THREAD cond wait\n"); pthread_cond_wait(&cond, &lmu); printf("GET COND SIGNAL\n"); pthread_mutex_unlock(&lmu); printf("EXIT\n"); pthread_cleanup_pop(0); } |
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|