ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. Thread Ãë¼Ò¿Í Á¾·á
¾²·¹µå¿¡ ´ëÇØ¼ ÇнÀÀ» ÇØº»ÀûÀÌ ÀÖ´Ù¸é Thread Ãë¼Ò¿Í Á¾·á¿¡ ´ëÇÑ ³»¿ëÀº »·ÇÑ °Í ¾Æ´Ï³Ä ¶ó°í »ý°¢ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ¹®¼¸¦ ÀÐ¾î º¸¸é ¿Ö º°µµÀÇ ¹®¼¸¦ ¸¸µé¾î¼ Á¾·á¿Í Ãë¼Ò¿¡ ´ëÇØ¼ ´Ù·ç¾ú´ÂÁö ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ´Ù. Thread Ãë¼Ò(cancellation)¿Í Á¾·á
¾²·¹µå´Â Á¦¾î°¡´ÉÇÑ °´Ã¼·Î Çʿ信 µû¶ó »ý¼º½Ãų ¼ö ÀÖµíÀÌ Çʿ信 µû¶ó¼ Áß´Ü ½Ãų ¼öµµ ÀÖ´Ù. ÀÌ ¾²·¹µå Áß´ÜÀ̶ó´Â °ÍÀÌ ¸Å¿ì ´Ü¼øÇÑ ÇàÀ§¶ó°í »ý°¢µÇÁö¸¸ »ý°¢Ã³·³ ±×·¸°Ô ´Ü¼øÇÑ ÇàÀ§°¡ ¾Æ´Ï´Ù.
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ¾²·¹µå°£ µ¿±âȸ¦ À§Çؼ Á¶°Çº¯¼ö ¹ÂÅØ½ºµî À» »ç¿ëÇϰí ÀÖÀ» °ÍÀ̸ç, ¿©·¯°¡Áö °øÀ¯ ÀÚ¿øµé ¿ª½Ã °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ¸î¸íÀÇ ÀοøÀÌ °°ÀÌ Âü°¡Çؼ ÁøÇàÇÏ´Â ÇÁ·ÎÁ§Æ®°¡ ÀÖ´Ù°í »ý°¢ÇØ º¸ÀÚ. ±×Áß ÇѸíÀÌ ÇÁ·ÎÁ§Æ®¿¡¼ ºüÁö¸é ³ª¸ÓÁö ÀοøÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇϴµ¥ ¹®Á¦°¡ »ý±âÁö ¾Êµµ·Ï ÀÌ·± Àú·± µÞ¼ö½ÀÀ» ÇØÁÖ´Â°Ô ¸Å¿ì Áß¿äÇÏ´Ù. ¾²·¹µå ¿ª½Ã ¸¶Âù°¡Áö·Î Áß´Ü(Á¾·á)½Ã µÞ¼ö½ÀÀ» ÇØÁÖ´Â °ÍÀº ¸Å¿ì Áß¿äÇÑ ÀÏÀÌ´Ù. ÀÌ ¹®¼´Â ¾²·¹µå Ãë¼Ò¿¡ °ü·ÃµÈ ³»¿ë°ú ¾²·¹µå Á¾·á½Ã ½Å°æ½á¾ßµÉ (ÀÚ¿øÁ¤¸® ¿Í °°Àº)°Íµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù. Thread Ãë¼Ò
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥¿¡¼ ƯÁ¤ ¾²·¹µå¸¦ Áß´Ü ½Ã۰íÀÚ ÇÒ¶§¸¦ À§Çؼ Pthread´Â ptread_cancel()À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. int pthread_cancel(pthread_t thread);ÀÌ ÇÔ¼ö´Â ÀÎÀÚ·Î ÁÖ¾îÁø ¾²·¹µå ½Äº°¹øÈ£ thread¸¦ °¡Áö´Â ¾²·¹µå¸¦ ÁßÁö½ÃŲ´Ù. ¸íÈ®È÷ ¸»ÇÏÀÚ¸é ¾²·¹µå¸¦ ÁßÁö ½ÃŰ´Â°Ô ¾Æ´Ï°í ¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ» ÇÏ´Â °ÍÀ¸·Î ºÁ¾ß ÇÑ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ¹ÝÀÀ ÇÒ·±Áö´Â ¿äûÀ» ¹ÞÀº ¾²·¹µåÀÇ Ãë¼Ò »óÅ ¼³Á¤¿¡ ÀÇÁ¸ÇÑ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå´Â Ãë¼Ò »óÅ¿¡ ÀÇÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÑ ÈÄ Á¾·á ÇÏ°Ô µÈ´Ù. Ãë¼Ò ¿äûÀ» ¹Þ¾Æ¼ Á¾·áÇÏ´Â ¾²·¹µå´Â pthread_exit(PTHREAD_CANCELED)¸¦ È£ÃâÇϰí Á¾·áÇÑ´Ù. pthread_cancel()¿¡ ÀÇÇØ¼ Ãë¼Ò°¡ Å뺸µÈ ¾²·¹µå´Â ¾²·¹µå Ãë¼Ò »óÅÂÀÇ ¼³Á¤¿¡ µû¶ó¼ Ãë¼Ò ¿äûÀ» ¹«½ÃÇÒ ¼öµµ Ãë¼ÒÁöÁ¡(cancellation point) ÁöÁ¡±îÁö ¼öÇàÇѵڿ¡ Á¾·á µÉ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.
¾²·¹µå Ãë¼Ò¿Í Á¾·á´Â ¾ö¿¬È÷ ´Ù¸£´Ù´Â °ÍÀ» ÀÌÇØÇϱ⠹ٶõ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¾ÕÀ¸·Î ¹®¼ÀÇ ³»¿ëÀ» Àдµ¥ Çê°¥¸± ¼ö ÀÖ´Ù. ¾²·¹µå Ãë¼Ò»óÅÂÀÇ ¼³Á¤
¾²·¹µå°¡ pthread_cancel()¿¡ ÀÇÇØ¼ Ãë¼Ò¿äûÀ» ¹Þ¾ÒÀ» ¶§ ¾î¶»°Ô ¹ÝÀÀÇÒ·±Áö¸¦ °áÁ¤ÇÏ´Â ¾²·¹µå Ãë¼Ò»óÅ´ ¿©·¯°¡Áö ¹æ¹ý¿¡ ÀÇÇØ¼ °áÁ¤µÈ´Ù. Ãë¼Ò »óÅ´ pthread_setcancelstat() ÇÔ¼ö¿¡ ÀÇÇØ °áÁ¤ÇÑ´Ù. int pthread_setcancelstate(int state, int *oldstate);ù¹øÂ° ÀÎÀÚÀÎ state´Â »õ·Î¿î Ãë¼Ò»óŸ¦ ¼³Á¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ oldstate´Â ÀÌÀüÀÇ Ãë¼Ò»óÅÂÀÇ ¼³Á¤°ªÀ» ¹Þ¾Æ¿À±â À§Çؼ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. int old_cancel_state; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancel_state); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancel_state); ¸¸¾à PTHREAD_CANCEL_ENABLE »óŶó¸é ¾²·¹µå´Â Ãë¼Ò¿äûÀ» ¹Þ¾ÆµéÀ̰í Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½ Ãë¼Ò ÁöÁ¡À» ¹þ¾î³ª¾ßÁö Á¾·áÇÑ´Ù. ENABLE »óÅÂÀÏ °æ¿ì º°µµ·Î Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½ Á¾·áÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ¹Ù·Î Á¾·áÇÒ °ÍÀÎÁö¸¦ pthread_setcanceltype() ¸¦ ÅëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à PTHREAD_CANCEL_DISABLE »óŶó¸é Ãë¼Ò¿äûÀ» ¹ÞÀº ÈÄ Ãë¼ÒÁöÁ¡±îÁöÀÇ ÁøÇàÀ» ÇÏÁö ¾Ê°í ¹Ù·Î Á¾·áÇÑ´Ù. ¾²·¹µå Ãë¼ÒÁ¾·ùÀÇ ¼³Á¤
¾²·¹µå Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_ENABLEÀÎ °æ¿ì Ãë¼ÒÀÇ Á¾·ù¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. Ãë¼ÒÁ¾·ùÀÇ °áÁ¤Àº pthread_setcanceltype()À» ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. int pthread_setcanceltype(int type, int *oldtype);Ãë¼ÒÁ¾·ù´Â type¸¦ ÅëÇØ¼ °áÁ¤µÈ´Ù. PTHREAD_CANCEL_ASYNCHRONOUS¿Í PTHREAD_CANCEL_DEFERRED µÑ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀüÀÚÀÏ °æ¿ì ¹Ù·Î Á¾·áÇϸç, ÈÄÀÚÀÇ °æ¿ì Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö ±â´Ù¸®°Ô µÈ´Ù. oldtype¸¦ ÀÌ¿ëÇØ¼ ÀÌÀü Ãë¼ÒŸÀÔÀ» ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. NULLÀ̶ó¸é ¹Þ¾Æ¿ÀÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼ö´Â ´ç¿¬ÇÏÁö¸¸ Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE ¶ó¸é ÀÇ¹Ì ¾ø´Â ÇÔ¼ö´Ù. Ãë¼ÒÁöÁ¡
¾²·¹µå¿¡°Ô Ãë¼Ò¿äûÀÌ ¿Ô´Ù°í ÇØ¼ ¹«Á¶°Ç Ãë¼ÒÇØ ¹ö¸®¸é ¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù. ¾î¶² ÀÏÀ» ó¸®Çϰí ÀÖ´Â Áß¿¡ Ãë¼Ò¿äûÀÌ Àü´ÞÇߴµ¥, º°·Î Áß¿äÇÏÁö ¾Ê´Â (¹«½ÃÇØµµ µÉ¸¸ÇÑ) ÀÏÀ̶ó¸é Áß´ÜÈÄ ¹Ù·Î Ãë¼ÒÇØµµ µÇ°ÚÁö¸¸ Áß¿äÇÑ ÀÏÀ» ó¸®ÇÏ´Â ÁßÀ̶ó¸é ÀÏÀ» ó¸®ÇÑÈÄ Á¾·á ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ ¸¶Áö ³ë¼±ÀÌ Ãë¼ÒÁöÁ¡ÀÌ´Ù.
Ãë¼ÒÁöÁ¡À¸·Î ¼³Á¤µÉ ¼ö ÀÖ´Â ¿µ¿ªÀº ´ÙÀ½°ú °°´Ù.
¾²·¹µå ±âº» Ãë¼Ò»óÅÂ¿Í Ãë¼Ò Á¾·ù
º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì pthread_create()·Î ¸¸µé¾î Áö´Â ¾²·¹µå´Â PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED·Î »óÅ·Π»ý¼ºµÈ´Ù. ¾²·¹µå Á¾·á½Ã ÀÚ¿øÁ¤¸®
pthread_cancel()µîÀ» ÅëÇØ¼ Á¾·á Å뺸¸¦ ¹ÞÀº ¾²·¹µå´Â Á¾·áÇϱâ Àü¿¡ ¿©·¯°¡Áö ÀÏÀ» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. ¹¹ °£´ÜÇÑ ¾²·¹µå¶ó¸é °ü°è ¾ø°ÚÁö¸¸ º¹ÀâÇÏ°Ô ¾ôÇô ÀÖ´Â ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ÀÌ·± Àú·± Á¤¸®ÇØÁà¾ß ÇÒ °ÍµéÀÌ ¸¹À» °ÍÀÌ´Ù. ¾²·¹µå Á¾·á½Ã ÀÚ¿øÇØÁ¦
¾²·¹µå¿¡¼ malloc()µîÀ» È£ÃâÇØ¼ ¸Þ¸ð¸® °ø°£À» È®º¸Çߴٰųª DB³ª ÆÄÀÏ, ¼ÒÄϵîÀ» ¿¾î¼ ÀÛ¾÷Çß´Ù¸é ¹Ýµå½Ã À̵é ÀÚ¿øÀ» ÇØÁ¦½ÃÄÑÁà¾ß ÇÑ´Ù. °£´ÜÇÏ°Ô »ý°¢ÇÏÀÚ¸é ¾²·¹µå Á¾·á½ÃÁ¡¿¡¼ free(), close(), DB¶ó¸é ÀÌ·± Àú·± Á¤¸®¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù. ±×·¯³ª pthrad_cancel()µî¿¡ ÀÇÇØ¼ ÀÛ¾÷Áß°£¿¡ ¿äûÀ» ¹Þ¾Ò´Ù¸é ±×¸® °£´ÜÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. ¾²·¹µå ¸¶Áö¸·±îÁö ·çƾÀ» ÁøÇàÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ·² °æ¿ì¸¦ ´ëºñÇØ¼ pthread_cleanup_push(), pthread_cleanup_pop()¿Í °°Àº ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ È£ÃâÇØ¾ßÇÒ ÇÔ¼ö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¡¸Ó´Â À̵é ÇÔ¼ö¿¡ ÀÚ¿øÇØÁ¦¿Í °°Àº ÇÊ¿äÇÑ Äڵ带 ³Ö¾îµÎ±â¸¸ ÇÏ¸é µÈ´Ù. À̵é ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Pthread_API¸¦ Âü°íÇϱ⠹ٶõ´Ù. ÃÑÁ¤¸®
Áö±Ý±îÁöÀÇ ³»¿ëÀ» ¿¹Á¦¸¦ ÅëÇØ¼ Á¤¸®Çغ¸µµ·Ï ÇÏÀÚ.
#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("NO WAIT COND\n"); pthread_mutex_unlock(&lmu); printf("EXIT\n"); pthread_cleanup_pop(0); }main ¾²·¹µå´Â thread_func¸¦ ½ÇÇà½ÃŲ´Ù. thread_func´Â pthread_cond_wait()¿¡¼ ½ÅÈ£°¡ ¹ß»ýÇϱ⸦ ±â´Ù¸®°Ô µÈ´Ù. Àá½ÃÈÄ main ¾²·¹µå´Â pthread_cancel()À» ÀÌ¿ëÇØ¼ thread_func ¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ» ÇÏ°Ô µÈ´Ù. À§ÀÇ °æ¿ì thread_func¾²·¹µå´Â Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE·Î µÇ¾î Àֱ⠶§¹®¿¡ ¿äûÀ» ¹«½ÃÇÑ´Ù. ¶§¹®¿¡ cleanupÇÔ¼öµµ ½ÇÇàµÇÁö ¾Ê´Â´Ù. |
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|