pthread_mutex_lock
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

HTML º¯È¯¹®¼­
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<chapter lang=ko> 
<!-- ÀÛ¼ºÀÚ : yundream             --> 
<!-- ÀÛ¼ºÀÏ : 2004/01/10           --> 
<!-- ¿¬¶ôó : yunream@joinc.co.kr --> 
 
<!-- ÇÔ¼ö À̸§À» ÀÔ·ÂÇÕ´Ï´Ù --> 
<title>pthread_mutex_lock(3)</title> 
 
<!-- ÀÌ°Ç ÇÔ¼ö¿¡ ´ëÇÑ ´ë·«ÀûÀÎ ¼³¸íÀ̱¸¿ä --> 
<para> 
    ¹ÂÅØ½º Àá±ÝÀ» ¾ò°Å³ª ÇØÁ¦ÇÑ´Ù.   
</para> 
  
<!-- ¿©±â¿¡ ÇÔ¼öÀÇ °£´ÜÇÑ »ç¿ë¹ýÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>»ç¿ë¹ý</title> 
    <para> 
        <screen> 
#include <pthrad.h> 
int pthread_mutex_lock(pthread_mutex_t *mutex); 
int pthread_mutex_trylock(pthread_mutex_t *mutex); 
int pthread_mutex_unlock(pthread_mutex_t *mutex); 
int pthread_mutex_destroy(pthread_mutex_t *mutex); 
        </screen> 
    </para> 
</section> 
 
<!-- ¿©±â¿£ ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ ¼³¸í ÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>¼³¸í</title> 
    <para> 
        mutex´Â MUTual EXclusion(»óÈ£ ¹èÁ¦)devideÀÇ ÁÙÀÓ¸»·Î ¾²·¹µå°£  
        °øÀ¯ÇÏ´Â µ¥ÀÌÅÍ ¿µ¿ªÀ» º¸È£Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. µ¥ÀÌÅÍ ¿µ¿ªÀÇ  
        º¸È£´Â critical section(ÀÓ°è ¿µ¿ª)À» ¸¸µé°í ÀÓ°è ¿µ¿ª³»¿¡  
        ´ÜÇϳªÀÇ ¾²·¹µå¸¸ÀÌ ÁøÀÔ°¡´É Çϵµ·Ï ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.  
    </para> 
    <para> 
        º¸Åë ÀÌ ÀӰ迵¿ª¿¡´Â º¸È£ÇϰíÀÚ ÇÏ´Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¢±Ù/¼öÁ¤ ·çƾÀÌ  
        µé¾î°£´Ù. µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¢±Ù/¼öÁ¤ ·çƾ¿¡ ¿ÀÁ÷ ÇϳªÀÇ ¾²·¹µå¸¸ Á¢±Ù  
        °¡´ÉÇÏ°Ô µÇ¹Ç·Î °á±¹ µ¥ÀÌÅ͸¦ º¸È£ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.  
    </para> 
    <para> 
        ¹ÂÅØ½º´Â ´ÜÁö 2°³ÀÇ °¡´ÉÇÑ Çൿ¸¸ÀÌ Á¤ÀǵǾî ÀÖ´Ù. unlock¿Í lockÀÌ  
        ±×°Çµ¥, lock´Â ÀӰ迵¿ªÀº ÁøÀÔÇϱâ À§ÇÑ ¿äû, unlock´Â ÀӰ迵¿ªÀ»  
        ºüÁ®³ª¿À¸é¼­ ´Ù¸¥ ¾²·¹µå¿¡°Ô ÀӰ迵¿ªÀ» µÇµ¹·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù.  
        ¸¸¾à ¾²·¹µå°¡ ÀӰ迵¿ªÀÌ ÁøÀÔÇϱâ À§Çؼ­ lock¸¦ ½Ãµµ Çߴµ¥, ´Ù¸¥  
        ¾²·¹µå°¡ ÀÌ¹Ì ÀӰ迵¿ª¿¡ ÁøÀÔÇß´Ù¸é ÇØ´ç ¾²·¹µå°¡ unlock¸¦ ÇØ¼­  
        ÀӰ迵¿ªÀ» ºüÁ®³ª¿À±â Àü±îÁö ±â´Ù¸®°Ô µÈ´Ù.    
    </para> 
    <para> 
        mutex´Â <emphasis>fast</emphasis>¿Í <emphasis>recursive</emphasis>ÀÇ  
        2°¡Áö Á¾·ù°¡ Áö¿øµÈ´Ù. À̰ÍÀº lockÀ» ¾òÀº ¾²·¹µå°¡ ´Ù½Ã lock¸¦ ¾òÀ» ¼ö  
        ÀÖµµ·Ï ÇÒ °ÍÀÎÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ±âº»ÀûÀ¸·Î mutexÀÇ Á¾·ù´Â 
        fast »óÅ·Π½ÃÀ۵ȴÙ. mutex Á¾·ù¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº pthread_mutexattr_init(3)À» 
        Âü°íÇϱ⠹ٶõ´Ù.        
    </para> 
    <para> 
        <emphasis>pthread_mutex_t</emphasis>´Â ¹ÂÅØ½ºÀÇ Æ¯Â¡À» °áÁ¤Çϱâ À§Çؼ­  
        »ç¿ëÇÑ´Ù. PTHREAD_MUTEX_INITIALIZER(fast mutex)¿Í  
        PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP(recursive mutexe),  
        PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP(mutx ¿¡·¯ üũ¿ë)ÀÇ 3°¡Áö »ó¼ö°¡  
        ÁغñµÇ¾î ÀÖ´Ù. ÀÌÁß Çϳª¸¦ ¼±ÅÃÇÏ¸é µÈ´Ù.  
    </para> 
    <para> 
        pthread_mutex_lock()´Â (ÀӰ迵¿ª¿¡ ÁøÀÔÇϱâ À§ÇÔ)¹ÂÅØ½º Àá±ÝÀ» ¿äûÇÑ´Ù.  
        ¸¸¾à ¹ÂÅØ½ºÀÇ ÃÖ±Ù »óŰ¡ unlocked¶ó¸é ¾²·¹µå´Â Àá±ÝÀ» ¾ò°í ÀӰ迵¿ª¿¡  
        ÁøÀÔÇÏ°Ô µÇ°í ¸®ÅÏÇÑ´Ù. ´Ù¸¥ ¾²·¹µå°¡ ¹ÂÅØ½º Àá±ÝÀ» ¾òÀº »óŶó¸é  
        Àá±ÝÀ» ¾òÀ» ¼ö ÀÖÀ» ¶§±îÁö ±â´Ù¸®°Ô µÈ´Ù.  
    </para> 
    <para> 
        pthread_mutex_unlock()´Â ¹ÂÅØ½ºÀá±ÝÀ» µÇµ¹·ÁÁØ´Ù. ¸¸¾à fast ¹ÂÅØ½º¶ó¸é  
        pthread_mutex_unlock()´Â ¾ðÁ¦³ª unlocked »óŸ¦ µÇµ¹·ÁÁØ´Ù. recursive 
        ¹ÂÅØ½º¶ó¸é Àá°ÜÀÖ´Â ¹ÂÅØ½ºÀÇ ¼ö¸¦ °¨¼Ò½Ã۰í ÀÌ ¼ö°¡ 0ÀÌ µÈ´Ù¸é  
        ¹ÂÅØ½ºÀá±ÝÀ» µÇµ¹·ÁÁÖ°Ô µÈ´Ù.  
    </para> 
    <para> 
        pthread_mutex_destory()´Â ¹ÂÅØ½º °´Ã¼¸¦ »èÁ¦Çϰí ÀÚ¿øÀ» µÇµ¹·ÁÁØ´Ù.  
        ´õÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â ¹ÂÅØ½º´Â ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦Çϵµ·Ï  
        ÇÏÀÚ. ¸®´ª½º¿¡¼­ ¾²·¹µå´Â ¹ÂÅØ½º °´Ã¼¿Í º°°³·Î µÇ¾î ÀÖ´Ù. ±×·¯¹Ç·Î  
        ¾²·¹µå°¡ Á¾·áµÇ¾ú´Ù°í ÇÏ´õ¶óµµ ¹ÂÅØ½º °´Ã¼´Â ¿©ÀüÈ÷ ³²¾Æ ÀÖ°Ô µÈ´Ù.  
        ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¾ßÁö¸¸ ¹ÂÅØ½º °´Ã¼°¡ »èÁ¦ µÈ´Ù.  
    </para> 
</section> 
 
<!-- ÇÔ¼ö°¡ µÇµ¹·ÁÁÖ´Â °ªÀ̱¸¿ä --> 
<section> 
    <title>¹Ýȯ°ª</title> 
    <para> 
        pthread_mutex_init()´Â ¾ðÁ¦³ª 0À» ¸®ÅÏÇÑ´Ù. ´Ù¸¥ ¹ÂÅØ½º ÇÔ¼öµéÀº  
        ¼º°øÇß´Ù¸é 0, ½ÇÆÐÇß´Ù¸é 0ÀÌ ¾Æ´Ñ ¼ö¸¦ ¸®ÅÏÇϰí errno¸¦ ¼³Á¤ÇÑ´Ù.  
    </para> 
</section> 
 
<!-- ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ µÇµ¹·ÁÁÖ´Â °ªµéÀÔ´Ï´Ù --> 
<section> 
    <title>¿¡·¯</title> 
    <para> 
        pthread_mutex_lock()ÇÔ¼ö´Â ¾Æ·¡ÀÇ ¿¡·¯Äڵ带 ¹ÝȯÇÑ´Ù.  
        <variablelist>     
            <varlistentry> 
            <term>EINVAL</term>     
            <listitem> 
                <para>     
                    ¹ÂÅØ½º°¡ À߸ø ÃʱâÈ­ µÇ¾ú´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
 
            <varlistentry> 
            <term>EDEADLK</term> 
            <listitem> 
                <para> 
                    ÀÌ¹Ì Àá±ÝÀ» ¾òÀº ¾²·¹µå°¡ ´Ù½Ã Àá±ÝÀ» ¿äûÇÒ ¶§ 
                    (error checking ¹ÂÅØ½ºÀÏ °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Ù)     
                </para> 
            </listitem> 
            </varlistentry> 
        </variablelist>     
    </para> 
    <para> 
        pthread_mutex_trylock()ÇÔ¼ö´Â ¾Æ·¡ÀÇ ¿¡·¯Äڵ带 ¹ÝȯÇÑ´Ù.  
        <variablelist> 
            <varlistentry> 
            <term>EBUSY</term>     
            <listitem> 
                <para>     
                    ¹ÂÅØ½º°¡ Àá°Ü À־ Àá±ÝÀ» ¾òÀ» ¼ö ¾ø´Ù.             
                </para>     
            </listitem> 
            </varlistentry> 
 
            <varlistentry> 
            <term>EINVAL</term> 
            <listitem> 
                <para> 
                    ¹ÂÅØ½º°¡ À߸ø ÃʱâÈ­ µÇ¾ú´Ù. 
                </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(&ync_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> 
    </para> 
</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> 
        </orderedlist> 
    </para> 
</section> 
</chapter> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.