¾²·¹µå Á¾·á
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>thread_cancellation



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼­

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!--           --> 
<articleinfo> 
    <title>Thread Ãë¼Ò¿Í Á¾·á</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>yundream@joinc.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
    <revhistory> 
        <revision> 
            <revnumber>1.1</revnumber> 
            <date>2004³â 2¿ù 20ÀÏ 21½Ã</date> 
            <revremark>Ãë¼Ò»óÅ¿¡ ´ëÇÑ ¼³¸í¿À·ù ¼öÁ¤</revremark> 
        </revision> 
        <revision> 
            <revnumber>1.0</revnumber> 
            <date>2004³â 2¿ù 17ÀÏ 21½Ã</date> 
            <revremark>Ãë¼ÒÁ¾·ù¿¡ ´ëÇÑ ³»¿ë Ãß°¡</revremark> 
        </revision> 
        <revision> 
            <revnumber>0.9</revnumber> 
            <date>2004³â 2¿ù 17ÀÏ 20½Ã</date> 
            <revremark>Ãë¼Ò»óÅ¿¡ ´ëÇÑ À߸øµÈ ºÎºÐ ¼öÁ¤</revremark> 
        </revision> 
        <revision> 
            <revnumber>0.8</revnumber> 
            <date>2004³â 2¿ù 13ÀÏ 19½Ã</date> 
            <revremark>ÃÖÃÊ ¹®¼­ÀÛ¼º</revremark> 
        </revision> 
    </revhistory> 
</articleinfo> 
 
 
<!--                                                                 --> 
<!-- ¼½¼Ç ½ÃÀÛ                                                       --> 
<!--                                                                 --> 
<section> 
    <title>¼Ò°³</title> 
    <para> 
        ¾²·¹µå¿¡ ´ëÇØ¼­ ÇнÀÀ» ÇØº»ÀûÀÌ ÀÖ´Ù¸é Thread Ãë¼Ò¿Í Á¾·á¿¡ ´ëÇÑ  
        ³»¿ëÀº »·ÇÑ °Í ¾Æ´Ï³Ä ¶ó°í »ý°¢ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ¹®¼­¸¦  
        ÀÐ¾î º¸¸é ¿Ö º°µµÀÇ ¹®¼­¸¦ ¸¸µé¾î¼­ Á¾·á¿Í Ãë¼Ò¿¡ ´ëÇØ¼­ ´Ù·ç¾ú´ÂÁö  
        ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ´Ù.   
    </para> 
</section> 
 
<section> 
    <title>Thread Ãë¼Ò(cancellation)¿Í Á¾·á</title> 
    <para> 
        ¾²·¹µå´Â Á¦¾î°¡´ÉÇÑ °´Ã¼·Î Çʿ信 µû¶ó »ý¼º½Ãų ¼ö ÀÖµíÀÌ Çʿ信  
        µû¶ó¼­ Áß´Ü ½Ãų ¼öµµ ÀÖ´Ù. ÀÌ ¾²·¹µå Áß´ÜÀ̶ó´Â °ÍÀÌ ¸Å¿ì ´Ü¼øÇÑ  
        ÇàÀ§¶ó°í »ý°¢µÇÁö¸¸ »ý°¢Ã³·³ ±×·¸°Ô ´Ü¼øÇÑ ÇàÀ§°¡ ¾Æ´Ï´Ù. ¸ÖƼ  
        ¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ¾²·¹µå°£ µ¿±âÈ­¸¦ À§Çؼ­ Á¶°Çº¯¼ö ¹ÂÅØ½ºµî 
        À» »ç¿ëÇϰí ÀÖÀ» °ÍÀ̸ç, ¿©·¯°¡Áö °øÀ¯ ÀÚ¿øµé ¿ª½Ã °¡Áö°í ÀÖÀ»  
        °ÍÀÌ´Ù.  
    </para> 
    <para> 
        ¸î¸íÀÇ ÀοøÀÌ °°ÀÌ Âü°¡Çؼ­ ÁøÇàÇÏ´Â ÇÁ·ÎÁ§Æ®°¡ ÀÖ´Ù°í »ý°¢ÇØ º¸ÀÚ.  
        ±×Áß ÇѸíÀÌ ÇÁ·ÎÁ§Æ®¿¡¼­ ºüÁö¸é ³ª¸ÓÁö ÀοøÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇϴµ¥  
        ¹®Á¦°¡ »ý±âÁö ¾Êµµ·Ï ÀÌ·± Àú·± µÞ¼ö½ÀÀ» ÇØÁÖ´Â°Ô ¸Å¿ì Áß¿äÇÏ´Ù.  
        ¾²·¹µå ¿ª½Ã ¸¶Âù°¡Áö·Î Áß´Ü(Á¾·á)½Ã µÞ¼ö½ÀÀ» ÇØÁÖ´Â °ÍÀº ¸Å¿ì Áß¿äÇÑ  
        ÀÏÀÌ´Ù. ÀÌ ¹®¼­´Â ¾²·¹µå Ãë¼Ò¿¡ °ü·ÃµÈ ³»¿ë°ú ¾²·¹µå Á¾·á½Ã  
        ½Å°æ½á¾ßµÉ (ÀÚ¿øÁ¤¸® ¿Í °°Àº)°Íµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.      
    </para> 
    <section> 
        <title>Thread Ãë¼Ò</title> 
        <para> 
            ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥¿¡¼­ ƯÁ¤ ¾²·¹µå¸¦ Áß´Ü ½Ã۰íÀÚ ÇÒ¶§¸¦ À§Çؼ­ 
            Pthread´Â ptread_cancel()À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.            
            <screen> 
int pthread_cancel(pthread_t thread); 
            </screen> 
            ÀÌ ÇÔ¼ö´Â ÀÎÀÚ·Î ÁÖ¾îÁø ¾²·¹µå ½Äº°¹øÈ£  
            <emphasis>thread</emphasis>¸¦ °¡Áö´Â ¾²·¹µå¸¦ ÁßÁö½ÃŲ´Ù.  
            ¸íÈ®È÷ ¸»ÇÏÀÚ¸é ¾²·¹µå¸¦ ÁßÁö ½ÃŰ´Â°Ô ¾Æ´Ï°í ¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ»  
            ÇÏ´Â °ÍÀ¸·Î ºÁ¾ß ÇÑ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ¹ÝÀÀ ÇÒ·±Áö´Â  
            ¿äûÀ» ¹ÞÀº ¾²·¹µåÀÇ Ãë¼Ò »óÅ ¼³Á¤¿¡ ÀÇÁ¸ÇÑ´Ù. Ãë¼Ò ¿äûÀ»  
            ¹ÞÀº ¾²·¹µå´Â Ãë¼Ò »óÅ¿¡ ÀÇÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÑ ÈÄ Á¾·á ÇÏ°Ô µÈ´Ù.       
            Ãë¼Ò ¿äûÀ» ¹Þ¾Æ¼­ Á¾·áÇÏ´Â ¾²·¹µå´Â pthread_exit(PTHREAD_CANCELED)¸¦  
            È£ÃâÇϰí Á¾·áÇÑ´Ù.   
        </para> 
        <para> 
            pthread_cancel()¿¡ ÀÇÇØ¼­ Ãë¼Ò°¡ Å뺸µÈ 
            ¾²·¹µå´Â ¾²·¹µå Ãë¼Ò »óÅÂÀÇ ¼³Á¤¿¡ µû¶ó¼­  
            <emphasis>Ãë¼Ò ¿äûÀ» ¹«½Ã</emphasis>ÇÒ ¼öµµ   
            <emphasis>Ãë¼ÒÁöÁ¡(cancellation point)</emphasis> 
            ÁöÁ¡±îÁö ¼öÇàÇѵڿ¡ Á¾·á µÉ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.  
        </para> 
        <para> 
            ¾²·¹µå Ãë¼Ò¿Í Á¾·á´Â ¾ö¿¬È÷ ´Ù¸£´Ù´Â °ÍÀ» ÀÌÇØÇϱ⠹ٶõ´Ù.      
            ±×·¸Áö ¾ÊÀ¸¸é ¾ÕÀ¸·Î ¹®¼­ÀÇ ³»¿ëÀ» Àдµ¥ Çê°¥¸± ¼ö ÀÖ´Ù.   
        </para> 
        <section> 
            <title>¾²·¹µå Ãë¼Ò»óÅÂÀÇ ¼³Á¤</title> 
            <para> 
                ¾²·¹µå°¡ pthread_cancel()¿¡ ÀÇÇØ¼­ Ãë¼Ò¿äûÀ» ¹Þ¾ÒÀ» ¶§  
                ¾î¶»°Ô ¹ÝÀÀÇÒ·±Áö¸¦ °áÁ¤ÇÏ´Â ¾²·¹µå Ãë¼Ò»óÅ´ ¿©·¯°¡Áö  
                ¹æ¹ý¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù. Ãë¼Ò »óÅ´ pthread_setcancelstat() 
                ÇÔ¼ö¿¡ ÀÇÇØ °áÁ¤ÇÑ´Ù. 
                <screen> 
int pthread_setcancelstate(int state, int *oldstate); 
                </screen> 
                ù¹øÂ° ÀÎÀÚÀÎ <emphasis>state</emphasis>´Â »õ·Î¿î Ãë¼Ò»óŸ¦  
                ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ  
                <emphasis>oldstate</emphasis>´Â ÀÌÀüÀÇ Ãë¼Ò»óÅÂÀÇ ¼³Á¤°ªÀ»  
                ¹Þ¾Æ¿À±â À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.  
                <screen> 
int old_cancel_state; 
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancel_state); 
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancel_state); 
                </screen> 
                ¸¸¾à ÀÌÀüÀÇ Ãë¼Ò»óÅ ¼³Á¤°ªÀÌ ÇÊ¿ä ¾ø´Ù¸é old_cancel_state´ë½Å  
                NULLÀ» »ç¿ëÇÏ¸é µÈ´Ù. À§ÀÇ »ç¿ë¿¡¼­ ó·³ ¾²·¹µå´Â  
                PTHREAD_CANCEL_DISABLE¿Í PTHREAD_CANCEL_ENABLE µÑÁß ÇϳªÀÇ  
                Ãë¼Ò»óŸ¦ °¡Áú ¼ö ÀÖ´Ù. 
            </para> 
            <para> 
                ¸¸¾à PTHREAD_CANCEL_ENABLE »óŶó¸é ¾²·¹µå´Â Ãë¼Ò¿äûÀ»  
                ¹Þ¾ÆµéÀ̰í Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½ Ãë¼Ò ÁöÁ¡À» ¹þ¾î³ª¾ßÁö  
                Á¾·áÇÑ´Ù. ENABLE »óÅÂÀÏ °æ¿ì º°µµ·Î Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½  
                Á¾·áÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ¹Ù·Î Á¾·áÇÒ °ÍÀÎÁö¸¦ pthread_setcanceltype() 
                ¸¦ ÅëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.  
                ¸¸¾à PTHREAD_CANCEL_DISABLE »óŶó¸é Ãë¼Ò¿äûÀ»  
                ¹ÞÀº ÈÄ Ãë¼ÒÁöÁ¡±îÁöÀÇ ÁøÇàÀ» ÇÏÁö ¾Ê°í ¹Ù·Î Á¾·áÇÑ´Ù.     
            </para> 
        </section> 
        <section> 
            <title>¾²·¹µå Ãë¼ÒÁ¾·ùÀÇ ¼³Á¤</title> 
            <para> 
                ¾²·¹µå Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_ENABLEÀÎ °æ¿ì Ãë¼ÒÀÇ Á¾·ù¸¦ °áÁ¤ÇÒ  
                ¼ö ÀÖ´Ù. Ãë¼ÒÁ¾·ùÀÇ °áÁ¤Àº pthread_setcanceltype()À» ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù.  
                <screen> 
int pthread_setcanceltype(int type, int *oldtype); 
                </screen> 
                Ãë¼ÒÁ¾·ù´Â <emphasis>type</emphasis>¸¦ ÅëÇØ¼­ °áÁ¤µÈ´Ù.  
                <emphasis>PTHREAD_CANCEL_ASYNCHRONOUS</emphasis>¿Í 
                <emphasis>PTHREAD_CANCEL_DEFERRED</emphasis> µÑ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö 
                ÀÖ´Ù. ÀüÀÚÀÏ °æ¿ì ¹Ù·Î Á¾·áÇϸç, ÈÄÀÚÀÇ °æ¿ì Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö  
                ±â´Ù¸®°Ô µÈ´Ù. <emphasis>oldtype</emphasis>¸¦ ÀÌ¿ëÇØ¼­ ÀÌÀü Ãë¼ÒŸÀÔÀ» 
                ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. NULLÀ̶ó¸é ¹Þ¾Æ¿ÀÁö ¾Ê´Â´Ù. 
                ÀÌ ÇÔ¼ö´Â ´ç¿¬ÇÏÁö¸¸ Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE ¶ó¸é ÀÇ¹Ì ¾ø´Â 
                ÇÔ¼ö´Ù. 
            </para> 
        </section> 
        <section> 
            <title>Ãë¼ÒÁöÁ¡</title>     
            <para> 
                ¾²·¹µå¿¡°Ô Ãë¼Ò¿äûÀÌ ¿Ô´Ù°í ÇØ¼­ ¹«Á¶°Ç Ãë¼ÒÇØ ¹ö¸®¸é  
                ¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù. ¾î¶² ÀÏÀ» ó¸®Çϰí ÀÖ´Â Áß¿¡  
                Ãë¼Ò¿äûÀÌ Àü´ÞÇߴµ¥, º°·Î Áß¿äÇÏÁö ¾Ê´Â (¹«½ÃÇØµµ µÉ¸¸ÇÑ) 
                ÀÏÀ̶ó¸é Áß´ÜÈÄ ¹Ù·Î Ãë¼ÒÇØµµ µÇ°ÚÁö¸¸ Áß¿äÇÑ ÀÏÀ» ó¸®ÇÏ´Â  
                ÁßÀ̶ó¸é ÀÏÀ» ó¸®ÇÑÈÄ Á¾·á ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ ¸¶Áö ³ë¼±ÀÌ  
                Ãë¼ÒÁöÁ¡ÀÌ´Ù.    
            </para> 
            <para> 
                Ãë¼ÒÁöÁ¡À¸·Î ¼³Á¤µÉ ¼ö ÀÖ´Â ¿µ¿ªÀº ´ÙÀ½°ú °°´Ù.  
                <screen> 
pthread_join(3) 
pthread_cond_wait(3) 
pthread_cond_timedwait(3) 
pthread_testcancel(3) 
sem_wait(3) 
sigwait(3) 
                </screen> 
                pthread_setcancelstate()ÇÔ¼ö¿¡ ÀÇÇØ¼­ PTHREAD_CANCEL_ENABLE  
                »óÅ·ΠµÇ¾î ÀÖ´Ù¸é Ãë¼ÒÁöÁ¡À» ¹«½ÃÇϰí Áï½Ã Á¾·á µÈ´Ù.  
                PTHREAD_CANCEL_DISABLE·Î µÇ¾î ÀÖ´Ù¸é À§ÀÇ Ãë¼ÒÁöÁ¡À»  
                ¹þ¾î³¯ ¶§±îÁö ±â´Ù¸°´Ù. Áï Ãë¼Ò¿äûÀ» ¹ÞÀº ¾²·¹µå°¡  
                pthread_cond_wait()¿¡¼­ Á¶°Çº¯¼ö¸¦ ±â´Ù¸®´Â°í ÀÖ´Ù¸é Á¶°Çº¯¼ö 
                ¸¦ ¹ÞÀ» ¶§±îÁö Ãë¼Ò¸¦ À¯º¸ÇÏ°Ô µÈ´Ù.  
            </para> 
        </section> 
    </section> 
    <section> 
        <title>¾²·¹µå ±âº» Ãë¼Ò»óÅÂ¿Í Ãë¼Ò Á¾·ù</title> 
        <para> 
            º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì pthread_create()·Î ¸¸µé¾î Áö´Â ¾²·¹µå´Â 
            PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED·Î »óÅ·Π»ý¼ºµÈ´Ù. 
        </para> 
    </section> 
    <section> 
        <title>¾²·¹µå Á¾·á½Ã ÀÚ¿øÁ¤¸®</title>  
        <para> 
            pthread_cancel()µîÀ» ÅëÇØ¼­ Á¾·á Å뺸¸¦ ¹ÞÀº ¾²·¹µå´Â  
            Á¾·áÇϱâ Àü¿¡ ¿©·¯°¡Áö ÀÏÀ» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.  
            ¹¹ °£´ÜÇÑ ¾²·¹µå¶ó¸é °ü°è ¾ø°ÚÁö¸¸ º¹ÀâÇÏ°Ô ¾ôÇô ÀÖ´Â  
            ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ÀÌ·± Àú·± Á¤¸®ÇØÁà¾ß ÇÒ °ÍµéÀÌ  
            ¸¹À» °ÍÀÌ´Ù.    
        </para> 
        <section> 
            <title>¾²·¹µå Á¾·á½Ã ÀÚ¿øÇØÁ¦</title> 
            <para> 
                ¾²·¹µå¿¡¼­ malloc()µîÀ» È£ÃâÇØ¼­ ¸Þ¸ð¸® °ø°£À» È®º¸Çߴٰųª  
                DB³ª ÆÄÀÏ, ¼ÒÄϵîÀ» ¿­¾î¼­ ÀÛ¾÷Çß´Ù¸é ¹Ýµå½Ã À̵é ÀÚ¿øÀ»  
                ÇØÁ¦½ÃÄÑÁà¾ß ÇÑ´Ù. °£´ÜÇÏ°Ô »ý°¢ÇÏÀÚ¸é ¾²·¹µå Á¾·á½ÃÁ¡¿¡¼­  
                free(), close(), DB¶ó¸é ÀÌ·± Àú·± Á¤¸®¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù.  
                ±×·¯³ª pthrad_cancel()µî¿¡ ÀÇÇØ¼­ ÀÛ¾÷Áß°£¿¡ ¿äûÀ»  
                ¹Þ¾Ò´Ù¸é ±×¸® °£´ÜÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. ¾²·¹µå ¸¶Áö¸·±îÁö  
                ·çƾÀ» ÁøÇàÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ·² °æ¿ì¸¦ ´ëºñÇØ¼­  
                pthread_cleanup_push(), pthread_cleanup_pop()¿Í °°Àº  
                ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.      
            </para> 
            <para> 
                ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ È£ÃâÇØ¾ßÇÒ ÇÔ¼ö¸¦  
                ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¡¸Ó´Â À̵é ÇÔ¼ö¿¡ ÀÚ¿øÇØÁ¦¿Í  
                °°Àº ÇÊ¿äÇÑ Äڵ带 ³Ö¾îµÎ±â¸¸ ÇÏ¸é µÈ´Ù.  
                À̵é ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº  
                <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/pthread_API?action=highlight&value=kernel#CLEANUP">Pthread_API</ulink>¸¦ 
                Âü°íÇϱ⠹ٶõ´Ù. 
            </para> 
        </section> 
    </section> 
    <section> 
        <title>ÃÑÁ¤¸®</title> 
        <para> 
            Áö±Ý±îÁöÀÇ ³»¿ëÀ» ¿¹Á¦¸¦ ÅëÇØ¼­ Á¤¸®Çغ¸µµ·Ï ÇÏÀÚ. 
            <screen> 
#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); 
 
    while(1) 
    {  
        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); 
} 
            </screen> 
            main ¾²·¹µå´Â thread_func¸¦ ½ÇÇà½ÃŲ´Ù. thread_func´Â  
            pthread_cond_wait()¿¡¼­ ½ÅÈ£°¡ ¹ß»ýÇϱ⸦ ±â´Ù¸®°Ô µÈ´Ù.    
            Àá½ÃÈÄ main ¾²·¹µå´Â pthread_cancel()À» ÀÌ¿ëÇØ¼­ thread_func 
            ¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ» ÇÏ°Ô µÈ´Ù. À§ÀÇ °æ¿ì thread_func¾²·¹µå´Â  
            Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE·Î µÇ¾î Àֱ⠶§¹®¿¡ Ãë¼Ò ÁöÁ¡µîÀº  
            ºÎ½ÃÇÏ°í ¹Ù·Î Á¾·áµÈ´Ù. À̶§ pthread_cleanup_push()¿¡ µî·ÏµÈ  
            clean_upÇÔ¼ö°¡ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.    
        </para> 
        <para> 
            PTHREAD_CANCEL_ENABLE·Î µÇ¾î ÀÖÀ» °æ¿ì Ãë¼Ò ¿äûÀ» ¹Þ¾ÆµéÀÌ±â  
            ¶§¹®¿¡ Ãë¼Ò ¿äûÀÌ µé¾î¿À´õ ¶óµµ thread_func°¡ ÇöÀç Á¾·á  
            ÁöÁ¡¿¡ ¸Ó¹°·¯ Àֱ⠶§¹®¿¡ °ð¹Ù·Î Á¾·áÇÏÁö ¾Ê´Â´Ù.  
            main ¾²·¹µå¿¡¼­ pthread_cond_signal()¸¦  
            È£ÃâÇØ¼­ thread_func°¡ cond_wait»óŸ¦ ¹þ¾î³­ ÈÄ Á¾·áµÈ´Ù.  
            ¹°·Ð cleanup ÇÔ¼öµµ ½ÇÇàµÈ´Ù.    
        </para> 
    </section> 
</section> 
 
<section> 
    <title>Âü°í¹®Çå</title> 
    <para> 
        <orderedlist> 
            <listitem> 
            <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/pthread_API">pthread API ·¹ÆÛ·±½º</ulink> 
            </para> 
            </listitem> 
 
            <listitem> 
            <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_pthread_mutex_Á¶°Çº¯¼ö">mutex¿Í Á¶°Çº¯¼ö</ulink> 
            </para> 
            </listitem> 
        </orderedlist> 
    </para> 
</section> 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.