pthread - ¾²·¹µå Ãë¼Ò¿Í Á¾·á
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



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); 
 

¸¸¾à ÀÌÀüÀÇ Ãë¼Ò»óÅ ¼³Á¤°ªÀÌ ÇÊ¿ä ¾ø´Ù¸é old_cancel_state´ë½Å NULLÀ» »ç¿ëÇÏ¸é µÈ´Ù. À§ÀÇ »ç¿ë¿¡¼­ ó·³ ¾²·¹µå´Â PTHREAD_CANCEL_DISABLE¿Í PTHREAD_CANCEL_ENABLE µÑÁß ÇϳªÀÇ Ãë¼Ò»óŸ¦ °¡Áú ¼ö ÀÖ´Ù.
¸¸¾à 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_setcancelstate()ÇÔ¼ö¿¡ ÀÇÇØ¼­ PTHREAD_CANCEL_ENABLE »óÅ·ΠµÇ¾î ÀÖ´Ù¸é Ãë¼ÒÁöÁ¡À» ¹«½ÃÇϰí Áï½Ã Á¾·á µÈ´Ù. PTHREAD_CANCEL_DISABLE·Î µÇ¾î ÀÖ´Ù¸é À§ÀÇ Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö ±â´Ù¸°´Ù. Áï Ãë¼Ò¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ pthread_cond_wait()¿¡¼­ Á¶°Çº¯¼ö¸¦ ±â´Ù¸®´Â°í ÀÖ´Ù¸é Á¶°Çº¯¼ö ¸¦ ¹ÞÀ» ¶§±îÁö Ãë¼Ò¸¦ À¯º¸ÇÏ°Ô µÈ´Ù.

¾²·¹µå ±âº» Ãë¼Ò»óÅÂ¿Í Ãë¼Ò Á¾·ù

º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì 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ÇÔ¼öµµ ½ÇÇàµÇÁö ¾Ê´Â´Ù.

ÀÌÁ¦ PTHREAD_CANCEL_ENABLE·Î Å×½ºÆ® ÇØº¸¸é, ¾²·¹µå°¡ Á¾·áµÇ°í cleanupÇÔ¼ö°¡ ½ÇÇàµÇ´Â °É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


Âü°í¹®Çå

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.