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

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



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

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

1장. pthread_cond_wait(3)

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

Á¶°Çº¯¼ö °ü·Ã ¿¬»ê


1.1. »ç¿ë¹ý

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


1.2. ¼³¸í

Á¶°Çº¯¼ö´Â ¾²·¹µå°£ µ¿±âÈ­¸¦ À§Çؼ­ »ç¿ëÇÏ´Â ÀåÄ¡·Î½á, °øÀ¯µÇ´Â µ¥ÀÌÅÍÀÇ ¾ÈÁ¤À» º¸ÀåÇϱâ À§ÇÑ ¿ëµµ·Î ÁÖ·Î »ç¿ëµÈ´Ù. Á¶°Çº¯¼öÀÇ ±âº»ÀûÀÎ ÀÛµ¿¹æ½ÄÀº ´ÙÀ½°ú °°´Ù. ÇϳªÀÇ ¾²·¹µå´Â Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö ƯÁ¤¿µ¿ª¿¡¼­ ´ë±â »óÅ¿¡ ³õÀÌ°Ô µÈ´Ù. ¸¸¾à ´Ù¸¥ ¾²·¹µå°¡ Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀ» º¸³½´Ù¸é ´ë±â »óÅ¿¡¼­ Ç®¸®°í ´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡°Ô µÈ´Ù.

Á¶°ßº¯¼ö´Â race conditionÀ» ÇÇÇØ¾ßÇϹǷΠ¹Ýµå½Ã ¹ÂÅØ½º(mutex)¿Í ÇÔ²² »ç¿ëµÇ¾î¾ß ÇÑ´Ù.

pthread_cond_init()´Â Á¶°Çº­¼ö cond¸¦ ÃʱâÈ­Çϱâ À§Çؼ­ »ç¿ëµÇ¸ç, cond_attr¸¦ ÀÌ¿ëÇØ¼­ Á¶°Çº¯¼öÀÇ Æ¯¼ºÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. NULLÀ» »ç¿ëÇÏ¸é ±âº»Æ¯¼ºÀÌ »ç¿ëµÈ´Ù. ¸®´ª½ºÀÇ °æ¿ì cond_attrÀº ¹«½ÃµÈ´Ù.

pthread_cond_t´Â »ó¼ö PTHREAD_COND_INITIALIZERÀ» ÀÌ¿ëÇØ¼­ staticÇÏ°Ô ÃʱâÈ­ ½Ãų ¼ö ÀÖ´Ù.

pthread_cond_signal()Àº Á¶°Çº¯¼öcond¿¡ ½Ã±×³ÎÀ» º¸³»¾î¼­ ´Ù¸¥ (Á¶°Çº¯¼ö cond¿¡¼­ ±â´Ù¸®´Â)¾²·¹µå¸¦ ±ú¿î´Ù. ¸¸¾à cond¿¡¼­ ±â´Ù¸®´Â ¾²·¹µå°¡ ¾ø´Ù¸é ¾Æ¹«·± Àϵµ ÀϾÁö ¾Ê°Ô µÈ´Ù. ¸¸¾à ¿©·¯°³ÀÇ ¾²·¹µå°¡ cond¿¡¼­ ±â´Ù¸®°í ÀÖ´Ù¸é Á¤È®È÷ ÀÌÁß Çϳª°¡ ±ú¾î³ª°Ô µÈ´Ù. ±×·¯³ª ¾î¶²°Ô ±ú¾î³¯Áö´Â ¾Ë ¼ö ¾ø´Ù.

pthread_cond_broadcast()´Â Á¶°Çº¯¼öcond¿¡¼­ ±â´Ù¸®´Â ¸ðµç ¾²·¹µå¸¦ ±ú¿î´Ù. ±â´Ù¸®´Â ¾²·¹µå°¡ ¾ø´Ù¸é ¾Æ¹«·± Àϵµ ÀϾÁö ¾Ê´Â´Ù.

pthread_cond_wait()´Â Á¶°Çº¯¼ö cond·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ±â¸¦ ±â´Ù¸°´Ù. ÀÌ ÇÔ¼ö´Â È£ÃâµÇ¸é ÀÚµ¿ÀûÀ¸·Î mutexÀá±ÝÀ» µÇµ¹·ÁÁØ´Ù - ³»ºÎÀûÀ¸·Î pthread_unlock_mutex()¸¦ È£ÃâÇÑ´Ù. -. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ¾²·¹µå´Â Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö ±â´Ù¸®¸ç, À̶§ CPU´Â ¼ÒºñÇÏÁö ¾Ê´Â´Ù. ½Ã±×³ÎÀ» Àü´Þ¹Þ¾Æ¼­ ¾²·¹µå°¡ ±ú¾î³ª¸é ÀÚµ¿ÀûÀ¸·Î mutexÀá±ÝÀ» ¾ò´Â´Ù - pthread_lock_mutex()¸¦ »ç¿ë-.

pthread_cond_timedwait()´Â pthread_cond_wait()ÀÇ ½Ã°£Á¦ÇÑ ¹öÁ¯À¸·Î abstime¸¦ ÀÌ¿ëÇØ¼­ Á¦Çѽð£ÀÌ Áö³¯ ¶§±îÁö ½Ã±×³ÎÀÌ Àü´ÞµÇÁö ¾Ê¾ÒÀ»°æ¿ì ¸®Åϵȴٴ °ÍÀ» Á¦¿ÜÇϰí´Â pthread_cond_wait()¿Í µ¿ÀÏÇÏ°Ô ÀÛµ¿ÇÑ´Ù. Á¦Çѽð£ÀÌ Áö³ª¼­ ¸®ÅϵǾúÀ» °æ¿ì errno·Î ETIMEOUTÀ» ¼³Á¤ÇÑ´Ù. abstime¿¡ ´ëÇØ¼­´Â time(2)¿Í, gettimeofday(2)¸¦ Âü°íÇϱ⠹ٶõ´Ù.

pthread_cond_destroy()´Â Á¶°Çº¯¼ö¸¦ »èÁ¦Çؼ­ ÀÚ¿øÀ» µÇµ¹·ÁÁØ´Ù.


1.3. Ãë¼Ò(CANCELLATITON)

pthread_cond_wait()¿Í pthread_cond_timedwait()´Â Ãë¼Ò»óÅÂÇÔ¼ö ÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Thread Ãë¼Ò¿Í Á¾·á¸¦ Âü°íÇϱ⠹ٶõ´Ù.


1.4. ¹Ýȯ°ª

¼º°øÇÒ°æ¿ì 0À» ½ÇÆÐÇßÀ»°æ¿ì¿¡´Â -1À» ¹ÝȯÇϸç, Àû´çÇÑ errno °ªÀ» ¼³Á¤ÇÑ´Ù.


1.5. ¿¡·¯

pthread_cond_init(), pthread_cond_signal(), pthread_cond_broadcast(), pthread_cond_wait()´Â ¿¡·¯Äڵ带 ¸®ÅÏÇÏÁö ¾Ê´Â´Ù.

pthread_cond_timewait()ÀÇ °æ¿ì ´ÙÀ½°ú °°Àº ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù.

ETIMEDOUT

½Ã°£Ãʰú °Ë»ç¸¦ À§ÇØ ÁöÁ¤µÈ abstime¸¦ ÃʰúÇØ¼­ ½Ã±×³ÎÀÌ ¹ß»ýÇÏÁö ¾Ê¾ÒÀ» ¶§.

EINTR

(À¯´Ð½º POSIX)½Ã±×³Îµî¿¡ ÀÇÇØ¼­ ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» ¶§

pthread_cond_destory()ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù.

EBUSY

cond¿¡ ±â´Ù¸®°í ÀÖ´Â ¾²·¹µå°¡ ³²¾ÆÀÖ´Ù.


1.6. ¿¹Á¦

#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++;
    }
}
		
À§ÀÇ ¿¹Á¦´Â ping&pong ÇÁ·Î±×·¥À¸·Î ping ¾²·¹µå¿Í pong¾²·¹µå°¡ ¹ø°¥¾Æ °¡¸é¼­ "ping", "pong"¸¦ ³¯¸®´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¾²·¹µå µ¿±âÈ­¸¦ À§Çؼ­ pthread_cond_wait()°ü·Ã ÇÔ¼öµéÀÌ »ç¿ëµÇ°í ÀÖ´Ù.

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