안녕하세요. pthread_cond_wait 에 관한 질문입니다.
글쓴이: lootpiz / 작성시간: 월, 2008/04/07 - 9:21오후
안녕하세요.
임계영역 설정에 관한 소스 입니다.
interleaving이 일어나지 않아서 결과가 10000이 찍혀야 하는데,
pthread_cond_wait에 익숙치 않아서 여쭈어봅니다.
pthread_cond_wait은 내부적으로 mutex를 unlock 시키고, waiting 한다는데,
어디서 잘못 되었는지 모르겠습니다.
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void* function(void* ptr); void P(int* semaphore); void V(int* semaphore); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condition = PTHREAD_COND_INITIALIZER; int conditionMet = 0; int accnt1 = 0; int accnt2 = 0; int main(int argc, char** argv) { pthread_t thread1, thread2; char* message1 = "Thread1"; char* message2 = "Thread2"; pthread_create( &thread1, NULL, function, (void*)message1 ); pthread_create( &thread2, NULL, function, (void*)message2 ); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } void* function(void* ptr) { int sum; int semaphore = 1; int counter = 0; do{ int r = rand(); P(&semaphore); int tmp1 = accnt1; int tmp2 = accnt2; accnt1 = tmp1 + r; accnt2 = tmp2 - r; sum = accnt1 + accnt2; V(&semaphore); }while(sum == 0 && ++counter < 10000); printf("%s::COUNTER >> %d\n", (char*)ptr, counter); } void P(int* semaphore) { pthread_mutex_lock(&mutex); *semaphore = *semaphore - 1; if(*semaphore < 0) { pthread_mutex_unlock(&mutex); if(!conditionMet) pthread_cond_wait(&condition, &mutex); } pthread_mutex_unlock(&mutex); } void V(int* semaphore) { pthread_mutex_lock(&mutex); *semaphore = *semaphore + 1; conditionMet = 1; if(*semaphore <= 0) pthread_cond_signal(&condition); else pthread_mutex_unlock(&mutex); }
과제이오니 답을 바로 안 가르쳐주시더라도 해결할 실마리 부탁드립니다^^
이것만 6시간째 해결 못하고 있습니다.
미리 감사드립니다.
Forums:
pthread_cond_wait()전에 pthread_mutex_unlock()는 부르지 말아야
pthread_cond_wait(&condition, &mutex);
statement실행하기 전에
pthread_mutex_unlock(&mutex);
를 실행한 것이 잘 못되었다고 봅니다.
/***************************************
Being the one is just like being in love.
***************************************/
/***************************************
Being the one is just like being in love.
***************************************/
답글 감사드립니다만, 그것으로도 해결이 되지 않습니다.
I'm working on IT.
ㅜ.ㅜ
I'm working on IT.
자세히 볼 시간은 안되서..
자세히 살펴볼 심적, 물리적 시간이 부족해서요.
"요기" 부분이 실행안되는 경우가 발생할 수 있을듯 한데요.
뮤텍스에선.. 큰일날 일이죠. ㅎㅎ
답변 감사드립니다만, 해결이 되지 않습니다.
I'm working on IT.
시간이 나시면 천천히 보아주세요.
그것만으로는 해결이 되지 않습니다.
그리고 알고리즘 상으로 else가 들어가는 것이 맞습니다.
I'm working on IT.
답변하신 분의 글을
답변하신 분들의 글을 다시 검토해보세요.
본인이 뭘 알고싶어하는지는 본인이 잘 알고있겠지만,
본인이 뭘 모르는지는 본인이 알기 힘듭니다.
반드시 lock 을 한 context 내에서 unlock 을 해야합니다.
다른 context 에서는 unlock 이 불가능합니다.
cond_signal() 측에서 lock 한 것을
cond_wait() 측에서 unlock 한다.
는 개념 자체를 수정하셔야 합니다.
OTL
댓글 달기