2015-02-06 2 views
2

아주 간단한 C 예제로 연주하고 있습니다. 프로그램은 두 개의 스레드를 생성하고 병렬로 시작합니다. 각 스레드는 뮤텍스를 사용하여 전역 변수를 수정하고 값을 출력하도록 설계되었습니다. 화면 출력을 뮤텍스와 pthread와 동기화하기

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

int A=10; 
pthread_mutex_t M; 

void *codice_Th1(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A++; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

void *codice_Th2(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A--; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

main()

단순히 스레드를 생성하고 스레드 1, 2

int main(){ 
    pthread_t th1, th2; 
    ... 
} 

어떤 날 귀찮게을 함께 메인 스레드에 가입, 나는 다음과 같은 출력을 얻을 것입니다

Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th2: Thread th1: A = 9 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 

반면에 mutex 내부에있는 모든 행은 차례대로 printf 명령문을 실행해야합니다. 즉

, 내가 OUPUT

Thread th2: Thread th1: A = 9 
난 항상

Thread NAME: A = VALUE 

비슷한 기대

를 이해할 수 있습니까 내가 모르는 뭔가가?

답변

2

신경 쓰지 마라. 나는 그 문제를 발견했다고 생각한다. 나는 그것을 사용하기 전에 pthread_mutex_init(&M, NULL);으로 뮤텍스를 초기화하지 않았다. 설정

int main(){ 
    pthread_t th1, th2; 
    int ret; 

    pthread_mutex_init(&M, NULL); 

이 문제를 해결했습니다. 나는 pthread_mutex_init을 사용한다고 가정한다. 유감스럽게도 mutex 초기화를 건너 뛰어도 경고 나 오류가 발생하지 않습니다. 스크립트가 자동으로 컴파일됩니다.

+2

미래에'main' 함수의 전체 (또는 적어도 관련 부분)를 포함 시켜서 이러한 오류를 찾을 수 있습니다. –

+0

@Daniel 당신은 절대적으로 옳습니다. 나는 실수로'main()'이 게시 될 가치가없는 단순한 것이라고 가정했다. –

+0

컴파일 타임에 경고 또는 오류를 생성 할 수 없습니다 ... 컴파일러가이 함수를 호출해야한다는 것을 어떻게 알 수 있습니까? 그것이 실제로 불리는 지 어떻게 알 수 있습니까? 변수 초기화는 C에서 매우 흔한 실수이며, 금지되지 않는다는 것을 기억하십시오. 그것들을 사용하는 것은 UB입니다. 이것은 정확히 뮤텍스에서 일어난 일입니다. –