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

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



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

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<chapter lang=ko> 
<!-- ÀÛ¼ºÀÚ : yundream             --> 
<!-- ÀÛ¼ºÀÏ : 2004/04/01           --> 
<!-- ¿¬¶ôó : yundream@joinc.co.kr --> 
 
<!-- ÇÔ¼ö À̸§À» ÀÔ·ÂÇÕ´Ï´Ù --> 
<title>pthread_cond_wait(3)</title> 
 
<!-- ÀÌ°Ç ÇÔ¼ö¿¡ ´ëÇÑ ´ë·«ÀûÀÎ ¼³¸íÀ̱¸¿ä --> 
<para> 
    Á¶°Çº¯¼ö °ü·Ã ¿¬»ê 
</para> 
  
<!-- ¿©±â¿¡ ÇÔ¼öÀÇ °£´ÜÇÑ »ç¿ë¹ýÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>»ç¿ë¹ý</title> 
    <para> 
        <screen> 
#include <pthread.h> 
 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
int pthread_cond_signal(pthread_cond_t *cond); 
int pthread_cond_signal(pthread_cond_t *cond, pthread_condattr_t *cond_attr); 
int pthread_cond_broadcast(pthread_cond_t *cond); 
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); 
int pthread_cond_destroy(pthread_cond_t *cond); 
        </screen> 
    </para> 
</section> 
 
<!-- ¿©±â¿£ ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ ¼³¸í ÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>¼³¸í</title> 
    <para> 
        Á¶°Çº¯¼ö´Â ¾²·¹µå°£ µ¿±âÈ­¸¦ À§Çؼ­ »ç¿ëÇÏ´Â ÀåÄ¡·Î½á, °øÀ¯µÇ´Â  
        µ¥ÀÌÅÍÀÇ ¾ÈÁ¤À» º¸ÀåÇϱâ À§ÇÑ ¿ëµµ·Î ÁÖ·Î »ç¿ëµÈ´Ù. Á¶°Çº¯¼öÀÇ  
        ±âº»ÀûÀÎ ÀÛµ¿¹æ½ÄÀº ´ÙÀ½°ú °°´Ù. ÇϳªÀÇ ¾²·¹µå´Â Á¶°Çº¯¼ö¿¡  
        ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö ƯÁ¤¿µ¿ª¿¡¼­ ´ë±â »óÅ¿¡ ³õÀÌ°Ô µÈ´Ù. ¸¸¾à  
        ´Ù¸¥ ¾²·¹µå°¡ Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀ» º¸³½´Ù¸é ´ë±â »óÅ¿¡¼­ Ç®¸®°í  
        ´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡°Ô µÈ´Ù.   
    </para> 
    <para> 
        Á¶°ßº¯¼ö´Â race conditionÀ» ÇÇÇØ¾ßÇϹǷΠ¹Ýµå½Ã ¹ÂÅØ½º(mutex)¿Í  
        ÇÔ²² »ç¿ëµÇ¾î¾ß ÇÑ´Ù.  
    </para> 
    <para> 
        pthread_cond_init()´Â Á¶°Çº­¼ö <emphasis>cond</emphasis>¸¦ ÃʱâÈ­Çϱâ 
        À§Çؼ­ »ç¿ëµÇ¸ç, <emphasis>cond_attr</emphasis>¸¦ ÀÌ¿ëÇØ¼­ Á¶°Çº¯¼öÀÇ 
        Ư¼ºÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. NULLÀ» »ç¿ëÇÏ¸é ±âº»Æ¯¼ºÀÌ »ç¿ëµÈ´Ù. ¸®´ª½ºÀÇ 
        °æ¿ì cond_attrÀº ¹«½ÃµÈ´Ù.      
    </para> 
    <para> 
        <emphasis>pthread_cond_t</emphasis>´Â »ó¼ö PTHREAD_COND_INITIALIZERÀ»  
        ÀÌ¿ëÇØ¼­ staticÇÏ°Ô ÃʱâÈ­ ½Ãų ¼ö ÀÖ´Ù.  
    </para> 
    <para> 
        pthread_cond_signal()Àº Á¶°Çº¯¼ö<emphasis>cond</emphasis>¿¡ ½Ã±×³ÎÀ»  
        º¸³»¾î¼­ ´Ù¸¥ (Á¶°Çº¯¼ö cond¿¡¼­ ±â´Ù¸®´Â)¾²·¹µå¸¦ ±ú¿î´Ù. ¸¸¾à  
        cond¿¡¼­ ±â´Ù¸®´Â ¾²·¹µå°¡ ¾ø´Ù¸é ¾Æ¹«·± Àϵµ ÀϾÁö ¾Ê°Ô µÈ´Ù.  
        ¸¸¾à ¿©·¯°³ÀÇ ¾²·¹µå°¡ cond¿¡¼­ ±â´Ù¸®°í ÀÖ´Ù¸é Á¤È®È÷ ÀÌÁß Çϳª°¡  
        ±ú¾î³ª°Ô µÈ´Ù. ±×·¯³ª ¾î¶²°Ô ±ú¾î³¯Áö´Â ¾Ë ¼ö ¾ø´Ù.  
    </para> 
    <para> 
        pthread_cond_boradcast()´Â Á¶°Çº¯¼ö<emphasis>cond</emphasis>¿¡¼­  
        ±â´Ù¸®´Â ¸ðµç ¾²·¹µå¸¦ ±ú¿î´Ù. ±â´Ù¸®´Â ¾²·¹µå°¡ ¾ø´Ù¸é ¾Æ¹«·± Àϵµ  
        ÀϾÁö ¾Ê´Â´Ù.     
    </para> 
    <para> 
        pthread_cond_wait()´Â Á¶°Çº¯¼ö <emphasis>cond</emphasis>·Î ½Ã±×³ÎÀÌ  
        Àü´ÞµÇ±â¸¦ ±â´Ù¸°´Ù. ÀÌ ÇÔ¼ö´Â È£ÃâµÇ¸é ÀÚµ¿ÀûÀ¸·Î  
        <emphasis>mutex</emphasis>Àá±ÝÀ» µÇµ¹·ÁÁØ´Ù - ³»ºÎÀûÀ¸·Î  
        pthread_unlock_mutex()¸¦ È£ÃâÇÑ´Ù. -. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ¾²·¹µå´Â  
        Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö ±â´Ù¸®¸ç, À̶§ CPU´Â ¼ÒºñÇÏÁö  
        ¾Ê´Â´Ù. ½Ã±×³ÎÀ» Àü´Þ¹Þ¾Æ¼­ ¾²·¹µå°¡ ±ú¾î³ª¸é ÀÚµ¿ÀûÀ¸·Î  
        <emphasis>mutex</emphasis>Àá±ÝÀ» ¾ò´Â´Ù - pthread_lock_mutex()¸¦ »ç¿ë-. 
    </para> 
    <para> 
        pthread_cond_timedwait()´Â pthread_cond_wait()ÀÇ ½Ã°£Á¦ÇÑ ¹öÁ¯À¸·Î  
        <emphasis>abstime</emphasis>¸¦ ÀÌ¿ëÇØ¼­ Á¦Çѽð£ÀÌ Áö³¯ ¶§±îÁö ½Ã±×³ÎÀÌ 
        Àü´ÞµÇÁö ¾Ê¾ÒÀ»°æ¿ì ¸®Åϵȴٴ °ÍÀ» Á¦¿ÜÇϰí´Â pthread_cond_wait()¿Í  
        µ¿ÀÏÇÏ°Ô ÀÛµ¿ÇÑ´Ù. Á¦Çѽð£ÀÌ Áö³ª¼­ ¸®ÅϵǾúÀ» °æ¿ì errno·Î   
        <emphasis>ETIMEOUT</emphasis>À» ¼³Á¤ÇÑ´Ù. <emphasis>abstime</emphasis>¿¡ 
        ´ëÇØ¼­´Â time(2)¿Í, gettimeofday(2)¸¦ Âü°íÇϱ⠹ٶõ´Ù.  
    </para> 
    <para> 
        pthread_cond_destroy()´Â Á¶°Çº¯¼ö¸¦ »èÁ¦Çؼ­ ÀÚ¿øÀ» µÇµ¹·ÁÁØ´Ù. 
    </para> 
</section> 
<section> 
    <title>Ãë¼Ò(CANCELLATITON)</title> 
    <para> 
        pthread_cond_wait()¿Í pthread_cond_timedwait()´Â Ãë¼Ò»óÅÂÇÔ¼ö ÀÌ´Ù.  
        ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº  
        <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_thread_cancellation">Thread Ãë¼Ò¿Í Á¾·á</ulink>¸¦ Âü°íÇϱ⠹ٶõ´Ù. 
    </para> 
</section> 
 
<!-- ÇÔ¼ö°¡ µÇµ¹·ÁÁÖ´Â °ªÀ̱¸¿ä --> 
<section> 
    <title>¹Ýȯ°ª</title> 
    <para> 
        ¼º°øÇÒ°æ¿ì 0À» ½ÇÆÐÇßÀ»°æ¿ì¿¡´Â -1À» ¹ÝȯÇϸç, Àû´çÇÑ errno °ªÀ»  
        ¼³Á¤ÇÑ´Ù.  
    </para> 
</section> 
 
<!-- ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ µÇµ¹·ÁÁÖ´Â °ªµéÀÔ´Ï´Ù --> 
<section> 
    <title>¿¡·¯</title> 
    <para> 
        pthread_cond_init(), pthread_cond_signal(), pthread_cond_broadcast(), 
        pthread_cond_wait()´Â ¿¡·¯Äڵ带 ¸®ÅÏÇÏÁö ¾Ê´Â´Ù. 
    </para> 
    <para> 
        pthread_cond_timewait()ÀÇ °æ¿ì ´ÙÀ½°ú °°Àº ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù. 
        <variablelist>     
            <varlistentry> 
            <term>ETIMEDOUT</term>     
            <listitem> 
                <para>     
                    ½Ã°£Ãʰú °Ë»ç¸¦ À§ÇØ ÁöÁ¤µÈ <emphasis>abstime</emphasis>¸¦ 
                    ÃʰúÇØ¼­ ½Ã±×³ÎÀÌ ¹ß»ýÇÏÁö ¾Ê¾ÒÀ» ¶§.     
                </para>     
            </listitem> 
            </varlistentry> 
 
            <varlistentry> 
            <term>EINTR</term> 
            <listitem> 
                <para> 
                    (À¯´Ð½º POSIX)½Ã±×³Îµî¿¡ ÀÇÇØ¼­ ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» ¶§ 
                </para> 
            </listitem> 
            </varlistentry> 
        </variablelist>     
    </para> 
    <para> 
        pthread_cond_destory()ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù. 
        <variablelist>     
            <varlistentry> 
            <term>EBUSY</term>     
            <listitem> 
                <para>     
                    <emphasis>cond</emphasis>¿¡ ±â´Ù¸®°í ÀÖ´Â ¾²·¹µå°¡ ³²¾ÆÀÖ´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
        </variablelist>     
    </para> 
</section> 
<section> 
    <title>¿¹Á¦</title> 
    <para> 
        <screen> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <vector> 
#include <iostream> 
 
using namespace std; 
 
void *ping(void *); 
void *pong(void *); 
 
pthread_mutex_t sync_mutex; 
pthread_cond_t  sync_cond; 
 
pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t  gcond  = PTHREAD_COND_INITIALIZER; 
                                                    
int main() 
{ 
    vector<void *(*)(void *)> thread_list; 
    vector<pthread_t> tident(10); 
    int thresult; 
    int status; 
    int i; 
                                           
    pthread_mutex_init(&sync_mutex, NULL); 
    pthread_cond_init(&sync_cond, NULL); 
 
    thread_list.push_back(pong); 
    thread_list.push_back(ping); 
 
    for(i = 0; i < thread_list.size(); i++ ) 
    { 
        pthread_mutex_lock(&sync_mutex); 
        if (pthread_create(&tident[i], NULL, thread_list[i], (void *)NULL) <0) 
        { 
            perror("error:"); 
            exit(0); 
        } 
        pthread_cond_wait(&sync_cond, &sync_mutex); 
        pthread_mutex_unlock(&sync_mutex); 
    } 
    for (i = 0; i < tident.size(); i++) 
    { 
        pthread_join(tident[i], (void **)&status); 
    } 
} 
                          
void *ping(void *data) 
{ 
    int i=0; 
    pthread_mutex_lock(&sync_mutex); 
    pthread_cond_signal(&sync_cond); 
    pthread_mutex_unlock(&sync_mutex); 
    while(1) 
    { 
        pthread_mutex_lock(&gmutex); 
        printf("%d : ping\n", i); 
        pthread_cond_signal(&gcond); 
        pthread_cond_wait(&gcond, &gmutex); 
        pthread_mutex_unlock(&gmutex); 
        usleep(random()%100); 
        i++; 
    } 
} 
                                                    
void *pong(void *data) 
{ 
    int i = 0; 
    pthread_mutex_lock(&sync_mutex); 
    sleep(1); 
    pthread_cond_signal(&sync_cond); 
    pthread_mutex_unlock(&sync_mutex); 
    while(1)                               
    { 
        pthread_mutex_lock(&gmutex); 
        pthread_cond_wait(&gcond, &gmutex); 
        printf("%d : pong\n", i); 
        pthread_cond_signal(&gcond); 
        pthread_mutex_unlock(&gmutex); 
        i++; 
    } 
} 
        </screen> 
        À§ÀÇ ¿¹Á¦´Â ping&pong ÇÁ·Î±×·¥À¸·Î ping ¾²·¹µå¿Í pong¾²·¹µå°¡  
        ¹ø°¥¾Æ °¡¸é¼­ "ping", "pong"¸¦ ³¯¸®´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¾²·¹µå µ¿±âÈ­¸¦  
        À§Çؼ­ pthread_cond_wait()°ü·Ã ÇÔ¼öµéÀÌ »ç¿ëµÇ°í ÀÖ´Ù.      
    </para> 
</section> 
<section> 
    <title>Âü°í¹®Çå</title> 
    <para> 
        <orderedlist> 
        <listitem> 
            <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_thread_cancellation">Thread Ãë¼Ò¿Í Á¾·á</ulink> 
            </para> 
        </listitem> 
        <listitem> 
            <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_Pthread_API_Reference">Pthread API</ulink> 
            </para> 
        </listitem> 
        <listitem> 
            <para> 
            <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_´õ_±íÀÌ">Pthread ´õ ±íÀÌ</ulink> 
            </para> 
        </listitem> 
        </orderedlist> 
    </para> 
</section> 
 
</chapter> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.