pthread_cancel(3)
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<chapter lang=ko> 
<!-- ÀÛ¼ºÀÚ : yundream             --> 
<!-- ÀÛ¼ºÀÏ : 2004/02/17           --> 
<!-- ¿¬¶ôó : yundream@joinc.co.kr --> 
 
<!-- ÇÔ¼ö À̸§À» ÀÔ·ÂÇÕ´Ï´Ù --> 
<title>pthread_cancel(3)</title> 
 
<!-- ÀÌ°Ç ÇÔ¼ö¿¡ ´ëÇÑ ´ë·«ÀûÀÎ ¼³¸íÀ̱¸¿ä --> 
<para> 
    Thread¿¡ ´ëÇÑ Ãë¼Ò 
</para> 
  
<!-- ¿©±â¿¡ ÇÔ¼öÀÇ °£´ÜÇÑ »ç¿ë¹ýÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>»ç¿ë¹ý</title> 
    <para> 
        <screen> 
#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); 
        </screen> 
    </para> 
</section> 
 
<!-- ¿©±â¿£ ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ ¼³¸í ÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>¼³¸í</title> 
    <para> 
        À̵é ÇÔ¼ö´Â ÇϳªÀÇ ¾²·¹µå¿¡¼­ ½ÇÇàÁßÀÎ ´Ù¸¥ ¾²·¹µå¸¦ Á¾·áÇ챉  
        À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. Á»´õ ±×·²µíÇÏ°Ô ¸»ÇÏÀÚ¸é ´Ù¸¥ ¾²·¹µå¿¡°Ô  
        ¾²·¹µå Ãë¼Ò¸¦ ¿äûÇÏ´Â °Í°ú °ü·ÃµÈ ÀÛ¾îÀ» À§ÇØ »ç¿ëµÈ´Ù.  
        ¾²·¹µå Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ÀÛµ¿ÇÒ·±Áö´Â ¼³Á¤¿¡  
        ÀÇÁ¸ÀûÀÌ´Ù. ¿äûÀ» ¹ÞÀº ¾²·¹µå´Â °ð¹Ù·Î Á¾·áÇÒ ¼öµµ ÀÖ°í  
        Ãë¼Ò ÁöÁ¡(cancellation point)À» ¹þ¾î³­ÈÄ Á¾·áÇÒ ¼öµµ ÀÖ´Ù.  
    </para> 
    <para> 
        ¾²·¹µå°¡ Á¾·á ¿äûÀ» ¹Þ¾Ò´Ù¸é, ÇØ´ç ¾²·¹µå´Â  
        pthread_exit(PTHREAD_CANCELED)¸¦ ¼öÇàÇÑ´Ù. ¶ÇÇÑ ¸ðµç  
        cleanup handlerµµ ¼öÇàÇϸç, thread-specific µ¥ÀÌÅ͸¦ È£ÃâÇ졒  
        ¾²·¹µå°¡ Á¾·áµÈ´Ù. Á¾·á½Ã ¸®ÅϵǴ °ªÀº PTHREAD_CANCELEDÀÌ´Ù.  
        ¾²·¹µå Á¾·á¿Í °ü·ÃµÈ ÀÚ¼¼ÇÑ ³»¿ëÀº pthread_exit(3)À» Âü°íÇ챉  
        ¹Ù¶õ´Ù.  
    </para> 
    <para> 
        pthread_cancel()Àº ÀÎÀÚ·Î ÁÖ¾îÁø ¾²·¹µå ½Äº°ÀÚ  
        <emphasis>thread</emphasis>¸¦ °¡Áö´Â ¾²·¹µå¿¡°Ô Á¾·á ¿äûÀ» º¸³½´Ù.   
    </para> 
    <para> 
        pthread_setcancelstate()´Â ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ¾²·¹µðÀÇ Ãë¼Ò »óŸ¦   
        º¯°æÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. Ãë¼Ò»óÅ´  
        <emphasis>PTHREAD_CANCEL_ENABLE</emphasis>,  
        <emphasis>PTHREAD_CANCEL_DISABLE</emphasis>µÑÁß Çϳª°¡ ÁöÁ¤µÉ ¼ö  
        ÀÖ´Ù. ÀüÀÚ´Â Ãë¼Ò »óŸ¦ Ȱ¼ºÈ­ ½Ã۱â À§Çؼ­ ÈÄÀÚ´Â Ãë¼Ò »óŸ¦  
        ºñȰ¼ºÈ­ ½Ã۱â À§Çؼ­ »ç¿ëÇÑ´Ù. Ãë¼Ò»óÅ´ <emphasis>state</emphasis>¸¦ 
        ÅëÇØ¼­ ¼³Á¤µÈ´Ù. ÀÌÀüÀÇ Ãë¼Ò»óÅ´ <emphasis>oldstate</emphasis>¸¦  
        ÅëÇØ¼­ ¹Þ¾Æ¿Ã ¼ö ÀÖ´Ù. NULLÀÏ °æ¿ì ¹Þ¾Æ¿ÀÁö ¾Ê°Ô µÈ´Ù.     
    </para> 
    <para> 
        pthread_setcanceltype()´Â Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ¹ÝÀÀ  
        ÇÒ°ÇÁö(Ãë¼ÒŸÀÔ)¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¹ÝÀÀÀÇ Á¾·ù´Â 
        <emphasis>type</emphasis>¸¦ ÅëÇØ¼­ ¼³Á¤ÇÒ¼ö ÀÖ´Ù.  
        <emphasis>PTHREAD_CANCEL_ASYNCHRONOUS</emphasis>¿Í  
        <emphasis>PTHREAD_CANCEL_DEFERRED</emphasis> µÑ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö  
        ÀÖ´Ù. ÀüÀÚÀÏ °æ¿ì ¹Ù·Î Á¾·áÇϸç, ÈÄÀÚÀÇ °æ¿ì Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö  
        ±â´Ù¸®°Ô µÈ´Ù. <emphasis>oldtype</emphasis>¸¦ ÀÌ¿ëÇØ¼­ ÀÌÀü Ãë¼ÒŸÀÔÀ»  
        ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. NULLÀ̶ó¸é ¹Þ¾Æ¿ÀÁö ¾Ê´Â´Ù.  
        ÀÌ ÇÔ¼ö´Â ´ç¿¬ÇÏÁö¸¸ Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE ¶ó¸é ÀÇ¹Ì ¾ø´Â  
        ÇÔ¼ö´Ù.   
    </para> 
    <para> 
        º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì pthread_create()·Î ¸¸µé¾î Áö´Â ¾²·¹µå´Â  
        PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED·Î »óÅ·Π»ý¼ºµÈ´Ù.   
    </para> 
    <para> 
        Ãë¼ÒÁöÁ¡Àº ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå´Â  
        Ãë¼ÒÁöÁ¡¿¡ ´ë±âÇϰí ÀÖ´Ù°¡ ¹þ¾î³ª¸é Á¾·áÇÏ°Ô µÈ´Ù.     
        <screen> 
pthread_join(3) 
pthread_cond_wait(3) 
pthread_cond_timedwait(3) 
pthread_testcancel(3) 
sem_wait(3) 
sigwait(3) 
        </screen> 
    </para> 
</section> 
 
<!-- ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ µÇµ¹·ÁÁÖ´Â °ªµéÀÔ´Ï´Ù --> 
<section> 
    <title>¿¡·¯</title> 
    <para> 
        pthread_cancel 
        <variablelist>     
            <varlistentry> 
            <term>ESRCH</term>     
            <listitem> 
                <para>     
                    ¾²·¹µå ½Äº°ÀÚ <emphasis>thread</emphasis>¸¦ °¡Áö´Â  
                    ¾²·¹µå°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
        </variablelist>     
        pthread_setcancelstate 
        <variablelist>     
            <varlistentry> 
            <term>EINVAL</term>     
            <listitem> 
                <para>     
                    PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE ¿ÜÀÇ  
                    À߸øµÈ ÀÎÀÚ°¡ ÁöÁ¤µÇ¾ú´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
        </variablelist>     
        pthread_setcanceltype 
        <variablelist>     
            <varlistentry> 
            <term>EINVAL</term>     
            <listitem> 
                <para>     
                    PTHREAD_CANCEL_DEFERRED, PTHREAD_CANCEL_ASYNCHRONOUS ¿ÜÀÇ  
                    À߸øµÈ ÀÎÀÚ°¡ ÁöÁ¤µÇ¾ú´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
        </variablelist>     
    </para> 
</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> 
        Äڵ忡 ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_thread_cancellation">¾²·¹µå Á¾·á¿Í Ãë¼Ò</ulink>¸¦ Âü°íÇϱ⠹ٶõ´Ù. 
    </para> 
</section> 
<section> 
    <title>Âü°í¹®Çå</title> 
    <para> 
        <orderedlist> 
        <listitem> 
        <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_thread_cancellation">¾²·¹µå Á¾·á¿Í Ãë¼Ò</ulink> 
        </para> 
        </listitem> 
        <listitem> 
        <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/pthread_API">Pthread API</ulink> 
        </para> 
        </listitem> 
        </orderedlist> 
    </para> 
</section> 
 
</chapter> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.