Pthread에서 Condition Variable 및 mutex 질문입니다
글쓴이: smallhuman / 작성시간: 수, 2014/04/23 - 3:36오후
Programming with POSIX threads 보고 있습니다. Condition Variable 부분을 보고 있는데요.
예제가 이해가 안 됩니다.
일단 코드부터 ^^;;
#include <pthread.h> #include <time.h> #include <stdio.h> #define LOG printf("LOG >> line : %d\n", __LINE__) typedef struct aa { pthread_mutex_t mutex; pthread_cond_t cond; int value; } my_struct_t; my_struct_t data = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0}; int hib = 1; void * wait_thread (void *arg){ int status; sleep(hib); status = pthread_mutex_lock(&data.mutex); /////////// 1번. data.value = 1; status = pthread_cond_signal (&data.cond); status = pthread_mutex_unlock(&data.mutex); return NULL; } int main (int argc, char *argv[]){ int status; pthread_t wait_thread_id; struct timespec timeout; status = pthread_create (&wait_thread_id, NULL, wait_thread, NULL); pthread_yield(); timeout.tv_sec = time(NULL) + 2; timeout.tv_nsec = 0; status = pthread_mutex_lock(&data.mutex); ////////// 2번. while (data.value == 0){ status = pthread_cond_timedwait( &data.cond, &data.mutex, &timeout); //////// 3번. if (status == 110){ /////////////////////////// 4번 printf("Condition wait timed out\n"); break; } } if (data.value != 0) printf("condition was signaled\n"); status = pthread_mutex_unlock(&data.mutex); return 0; }
코드 실행을 따라가 보면 일단 main 쪽에서 timedwait(3번) 까지 쭉 실행된 다음에 스레드가 실행됩니다.
일단 메인 스레드가 3번까지 와서 대기에 들어가고 이걸 자식스레드의 시그널로 깨우거나 timeout을 통해 깨우는 프로그램입니다.
hib (hibernation) 값에 따라서 누가 깨울지를 결정할 수 있습니다.
근데 제가 이해가 안 되는 게... 메인스레드의 2번에서 일단 mutex를 걸고, 자식스레드의 1번에서 또 mutex를 걸고 있습니다.
메인스레드가 먼저 실행되던데 이렇게 되면 자식스레드에서 1번 이후의 코드들이 실행되지 않지 않나요?
설명 보니까 'condition wait는 mutex를 한 번 풀고 다시 잠근다'라고 되어있던데 이것 때문에 자식스레드가 critical section에 진입할 수 있는건가요?
PS: 4번에 보시면 ETIMEDOUT 대신 110으로 리터럴 값을 줬습니다. 'ETIMEDOUT undecleared'라고 떠서 저렇게 했는데 왜 저러는지 모르겠습니다 ㅡ.ㅠ
Forums:
pthread_cond_wait(),
pthread_cond_wait(), pthread_cond_timedwait()는 wait하기 전에 mutex를 unlock하고, return하기 전에 mutex를 lock 합니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
그랬군요 ㅠ.ㅠ.. 왜 그러는지 이해는 안 되는데
그랬군요 ㅠ.ㅠ.. 왜 그러는지 이해는 안 되는데 여튼 동작은 알겠습니다. 감사합니다.
condition variable 사용시 mutex
condition variable 사용시 mutex 가 필요한 이유를 저도 처음에는 의아했는데 실제로 사용해보니 알겠더라구요.
그래서 제 경험을 토대로 blog 에 글을 올려놓았으니 보시고 도움이 되었으면 합니다.
http://imbumoh-pthread.blogspot.kr/
댓글 달기