2017-04-22 18 views
1

2 개의 스레드를 만들고 for 루프에서 "count"카운터를 증가시키는 동일한 함수를 호출하려고했습니다. 그러나이 코드를 실행할 때마다 카운터의 값이 다릅니다. mutex를 사용하여 전역 정적 변수 "count"를 증가시킬 때 스레드간에 동기화를 시도하지만 여전히 값이 다릅니다.mutex를 사용한 pthread 동기화

static int count; 
pthread_mutex_t count_mutex; 

void increment() 
{ 
    pthread_mutex_lock(&count_mutex); 
    count++; 
    pthread_mutex_unlock(&count_mutex); 
} 

void *myThreadFun1(void *var) 
{ 
    printf("Thread1\n"); 
    for(int i=0; i< 10000;i++) 
    { 
     increment(); 
    } 
    return; 
} 

int main() 
{ 
    pthread_t tid1; 
    pthread_t tid2; 
    pthread_create(&tid1, NULL, myThreadFun1, NULL); 
    // sleep(1); 
    pthread_create(&tid2, NULL, myThreadFun1, NULL); 
    pthread_join(tid1, NULL); 
    pthread_join(tid2, NULL); 

    printf("\n%d",count); 
    exit(0); 
} 

스레드간에 잠자기를하지 않으면 출력이 절대로 20000이되지 않습니다.

자바에서는 "동기화 된"키워드를 사용할 수 있지만 어떻게 C에서 동일한 결과를 얻을 수 있습니까?

+2

pthread_mutex_t는 사용하기 전에 초기화해야합니다. – ThingyWotsit

+0

예, PTHREAD_MUTEX_INITIALIZER로 초기화했는데 이제는 예상대로 출력됩니다. 감사. – gaurav

+0

@ gaurav는 작업 코드 버전을 업데이트합니다. –

답변

2

pthread_mutex_t는 사용하기 전에 초기화해야합니다. 잠금 해제 및 언 바운드를 시작해야합니다. 이 작업을 수행 할 수있는 pthread_mutex_init (& theMutex) 호출이 있습니다. 또는 정적 초기화에 미리 정의 된 값을 할당 할 수 있습니다. PTHREAD_MUTEX_INITIALIZER