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

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



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

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=pthread_mutex_lock">pthread_mutex_lock</a>(3)

1장. pthread_mutex_lock(3)

차례
1.1절. »ç¿ë¹ý
1.2절. ¼³¸í
1.3절. ¹Ýȯ°ª
1.4절. ¿¡·¯
1.5절. ¿¹Á¦
1.6절. Âü°í¹®Çå

¹ÂÅØ½º Àá±ÝÀ» ¾ò°Å³ª ÇØÁ¦ÇÑ´Ù.


1.1절. »ç¿ë¹ý

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


1.2절. ¼³¸í

mutex´Â MUTual EXclusion(»óÈ£ ¹èÁ¦)devideÀÇ ÁÙÀÓ¸»·Î ¾²·¹µå°£ °øÀ¯ÇÏ´Â µ¥ÀÌÅÍ ¿µ¿ªÀ» º¸È£Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. µ¥ÀÌÅÍ ¿µ¿ªÀÇ º¸È£´Â critical section(ÀÓ°è ¿µ¿ª)À» ¸¸µé°í ÀÓ°è ¿µ¿ª³»¿¡ ´ÜÇϳªÀÇ ¾²·¹µå¸¸ÀÌ ÁøÀÔ°¡´É Çϵµ·Ï ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.

º¸Åë ÀÌ ÀӰ迵¿ª¿¡´Â º¸È£ÇϰíÀÚ ÇÏ´Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¢±Ù/¼öÁ¤ ·çƾÀÌ µé¾î°£´Ù. µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¢±Ù/¼öÁ¤ ·çƾ¿¡ ¿ÀÁ÷ ÇϳªÀÇ ¾²·¹µå¸¸ Á¢±Ù °¡´ÉÇÏ°Ô µÇ¹Ç·Î °á±¹ µ¥ÀÌÅ͸¦ º¸È£ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

¹ÂÅØ½º´Â ´ÜÁö 2°³ÀÇ °¡´ÉÇÑ Çൿ¸¸ÀÌ Á¤ÀǵǾî ÀÖ´Ù. unlock¿Í lockÀÌ ±×°Çµ¥, lock´Â ÀӰ迵¿ªÀº ÁøÀÔÇϱâ À§ÇÑ ¿äû, unlock´Â ÀӰ迵¿ªÀ» ºüÁ®³ª¿À¸é¼­ ´Ù¸¥ ¾²·¹µå¿¡°Ô ÀӰ迵¿ªÀ» µÇµ¹·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. ¸¸¾à ¾²·¹µå°¡ ÀӰ迵¿ªÀÌ ÁøÀÔÇϱâ À§Çؼ­ lock¸¦ ½Ãµµ Çߴµ¥, ´Ù¸¥ ¾²·¹µå°¡ ÀÌ¹Ì ÀӰ迵¿ª¿¡ ÁøÀÔÇß´Ù¸é ÇØ´ç ¾²·¹µå°¡ unlock¸¦ ÇØ¼­ ÀӰ迵¿ªÀ» ºüÁ®³ª¿À±â Àü±îÁö ±â´Ù¸®°Ô µÈ´Ù.

mutex´Â fast¿Í recursiveÀÇ 2°¡Áö Á¾·ù°¡ Áö¿øµÈ´Ù. À̰ÍÀº lockÀ» ¾òÀº ¾²·¹µå°¡ ´Ù½Ã lock¸¦ ¾òÀ» ¼ö ÀÖµµ·Ï ÇÒ °ÍÀÎÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ±âº»ÀûÀ¸·Î mutexÀÇ Á¾·ù´Â fast »óÅ·Π½ÃÀ۵ȴÙ. mutex Á¾·ù¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº pthread_mutexattr_init(3)À» Âü°íÇϱ⠹ٶõ´Ù.

pthread_mutex_t´Â ¹ÂÅØ½ºÀÇ Æ¯Â¡À» °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. PTHREAD_MUTEX_INITIALIZER(fast mutex)¿Í PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP(recursive mutexe), PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP(mutx ¿¡·¯ üũ¿ë)ÀÇ 3°¡Áö »ó¼ö°¡ ÁغñµÇ¾î ÀÖ´Ù. ÀÌÁß Çϳª¸¦ ¼±ÅÃÇÏ¸é µÈ´Ù.

pthread_mutex_lock()´Â (ÀӰ迵¿ª¿¡ ÁøÀÔÇϱâ À§ÇÔ)¹ÂÅØ½º Àá±ÝÀ» ¿äûÇÑ´Ù. ¸¸¾à ¹ÂÅØ½ºÀÇ ÃÖ±Ù »óŰ¡ unlocked¶ó¸é ¾²·¹µå´Â Àá±ÝÀ» ¾ò°í ÀӰ迵¿ª¿¡ ÁøÀÔÇÏ°Ô µÇ°í ¸®ÅÏÇÑ´Ù. ´Ù¸¥ ¾²·¹µå°¡ ¹ÂÅØ½º Àá±ÝÀ» ¾òÀº »óŶó¸é Àá±ÝÀ» ¾òÀ» ¼ö ÀÖÀ» ¶§±îÁö ±â´Ù¸®°Ô µÈ´Ù.

pthread_mutex_unlock()´Â ¹ÂÅØ½ºÀá±ÝÀ» µÇµ¹·ÁÁØ´Ù. ¸¸¾à fast ¹ÂÅØ½º¶ó¸é pthread_mutex_unlock()´Â ¾ðÁ¦³ª unlocked »óŸ¦ µÇµ¹·ÁÁØ´Ù. recursive ¹ÂÅØ½º¶ó¸é Àá°ÜÀÖ´Â ¹ÂÅØ½ºÀÇ ¼ö¸¦ °¨¼Ò½Ã۰í ÀÌ ¼ö°¡ 0ÀÌ µÈ´Ù¸é ¹ÂÅØ½ºÀá±ÝÀ» µÇµ¹·ÁÁÖ°Ô µÈ´Ù.

pthread_mutex_destory()´Â ¹ÂÅØ½º °´Ã¼¸¦ »èÁ¦Çϰí ÀÚ¿øÀ» µÇµ¹·ÁÁØ´Ù. ´õÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â ¹ÂÅØ½º´Â ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦Çϵµ·Ï ÇÏÀÚ. ¸®´ª½º¿¡¼­ ¾²·¹µå´Â ¹ÂÅØ½º °´Ã¼¿Í º°°³·Î µÇ¾î ÀÖ´Ù. ±×·¯¹Ç·Î ¾²·¹µå°¡ Á¾·áµÇ¾ú´Ù°í ÇÏ´õ¶óµµ ¹ÂÅØ½º °´Ã¼´Â ¿©ÀüÈ÷ ³²¾Æ ÀÖ°Ô µÈ´Ù. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¾ßÁö¸¸ ¹ÂÅØ½º °´Ã¼°¡ »èÁ¦ µÈ´Ù.


1.3절. ¹Ýȯ°ª

pthread_mutex_init()´Â ¾ðÁ¦³ª 0À» ¸®ÅÏÇÑ´Ù. ´Ù¸¥ ¹ÂÅØ½º ÇÔ¼öµéÀº ¼º°øÇß´Ù¸é 0, ½ÇÆÐÇß´Ù¸é 0ÀÌ ¾Æ´Ñ ¼ö¸¦ ¸®ÅÏÇϰí errno¸¦ ¼³Á¤ÇÑ´Ù.


1.4절. ¿¡·¯

pthread_mutex_lock()ÇÔ¼ö´Â ¾Æ·¡ÀÇ ¿¡·¯Äڵ带 ¹ÝȯÇÑ´Ù.

EINVAL

¹ÂÅØ½º°¡ À߸ø ÃʱâÈ­ µÇ¾ú´Ù.

EDEADLK

ÀÌ¹Ì Àá±ÝÀ» ¾òÀº ¾²·¹µå°¡ ´Ù½Ã Àá±ÝÀ» ¿äûÇÒ ¶§ (error checking ¹ÂÅØ½ºÀÏ °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Ù)

pthread_mutex_trylock()ÇÔ¼ö´Â ¾Æ·¡ÀÇ ¿¡·¯Äڵ带 ¹ÝȯÇÑ´Ù.

EBUSY

¹ÂÅØ½º°¡ Àá°Ü À־ Àá±ÝÀ» ¾òÀ» ¼ö ¾ø´Ù.

EINVAL

¹ÂÅØ½º°¡ À߸ø ÃʱâÈ­ µÇ¾ú´Ù.


1.5절. ¿¹Á¦

#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++;
    }
}
		

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