2013-02-12 1 views
0

뮤텍스와 두 개의 스레드를 동기화 할 때 도움이 필요합니다. Iam C와 뮤텍스를 처음 접했고 여기서 무엇을해야할지 모르겠다. 이 코드에는 10 개로 계산되고 각 숫자가 인쇄되지만 동기화되지 않는 두 개의 스레드가 있으므로 동기화되지 않고 절반 동기화됩니다. 나가 말썽을 단지 끝에 얻는 것을 의미한다, 때때로 8 .. 9 .. 11, 8 .. 9 .. 10 .. 10 등등을 인쇄한다.C에서 뮤텍스를 사용하여 두 개의 pthread 동기화하기

뮤텍스에 대한 라인을 없애면 원시 코드를 변경할 수 없습니다. 즉, 원시 코드입니다. 뮤텍스에 대해서만 줄을 추가 할 수 있습니다.

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

pthread_mutex_t mutex; 

int g_ant = 0; 

void *writeloop(void *arg) { 
    while(g_ant < 10) { 
     pthread_mutex_lock(&mutex); 
     g_ant++; 
     usleep(rand()%10); 
     printf("%d\n", g_ant); 
     pthread_mutex_unlock(&mutex); 
    } 
    exit(0); 
} 

int main(void) 
{ 
    pthread_t tid; 
    pthread_mutex_init(&mutex, NULL); 
    pthread_create(&tid, NULL, writeloop, NULL); 
    writeloop(NULL); 
    pthread_join(tid, NULL); 
    pthread_mutex_destroy(&mutex); 
    return 0; 
} 
+2

가 코드 – 75inchpianist

+0

'정의되지 않은 참조를 모두 게시하시기 바랍니다 '지금 – zch

+0

죄송합니다, 고정 코드를 writeloop''. 다시 시도하십시오 :) – Codebox

답변

1

뮤텍스 외부의 조건으로 인해 올바른 값을받지 못할 수 있습니다. 루프를 보장하는 보장 방법은 순서에-writeloop에 다음과 같이 변경 될 작동합니다

void writeloop(void *arg) { 
    while (g_ant < 10) { 
     pthread_mutex_lock(&mutex); 
     if (g_ant >= 10) { 
      pthread_mutex_unlock(&mutex); 
      break; 
     } 

     g_ant++; 
     usleep(rand()%10); 
     printf("%d\n", g_ant); 
     pthread_mutex_unlock(&mutex); 
    } 
} 
+0

죄송합니다, 원시 코드를 변경할 수 없다는 것을 잊어 버렸습니다. 뮤텍스에 대한 코드 라인을 제거하면 이는 원시 코드입니다. 임 뮤텍스를 추가하여 스레드를 동기화하려고. 이것에 대한 또 다른 해결책이 있습니까? – Codebox

+0

뮤텍스에 대한 코드를 추가 한 경우 다른 방법으로 코드를 확실하게 변경할 수 있습니다. 'while (g_ant <10) '조건을 다시 "최소"로 원한다면 다시 놓을 수 있습니다 ... – user7116

+0

정말 고마워요. 나는 그것이 mutex_unlock 또는 lock의 나의 배치라고 생각했기 때문에 스레드가 카운트되기 전에 뮤텍스를 잠금 해제하거나 잠 갔거나 파괴했다. 그래서 그렇게 아무것도 아니 었나요? – Codebox