2016-06-25 1 views
0

우리는 Game of life에 대한 좋은 동기화를 찾으려고합니다.두 번째 스레드가 cond_wait에서 깨어나 지 않습니다.

따라서 우리는 하나의 프린터 스레드와 현재 다음에 인쇄 할 새로운 세대의 셀을 계산하는 두 개의 스레드를 가지고 있습니다.

계산 스레드는 이전 버전이 이미 인쇄 된 경우에만 새로운 세대의 게임 계산을 시작할 수 있습니다.

따라서 우리는 계산 스레드를 모두 깨우는 프린터 스레드에서 pthread_cond_signal()을 사용합니다. 어떤 이유

은 하나의 스레드 만 우리는 이미 대신에 신호의 방송 사용하려고 pthread_cond_wait()

에서 깨어 나면,하지만 아무런 영향을 미치지 않았다.

이 우리의 프린터 스레드가하는 일입니다 :

while(!field -> printed){ 
    printf("waiting for print_signal: %d\n", field -> printed); 
    pthread_mutex_unlock(&(field -> print_mutex)); 
    pthread_cond_wait(&(field -> print_signal), &(field -> print_mutex)); 
    printf("print_signal received: %d\n", field -> printed); 
} 
printf("print_signal received2: %d\n", field -> printed); 
pthread_mutex_unlock(&(field -> print_mutex)); 

는 그 뒤 계산 스레드가 자신의 계산을하고 설정하기 전에 완료 모든 스레드까지 기다릴 :

field -> printed = true; 
//pthread_mutex_unlock(&(field -> print_mutex)); 
int status = pthread_cond_signal(&(field -> print_signal)); 

이것은 우리의 계산 스레드가하는 일입니다 필드 -> false로 다시 인쇄됩니다.

뮤텍스를 올바르게 사용하는 방법을 아직 제대로 모르는 것 같습니다.

답변

1

pthread_cond_signal()은 대기중인 모든 스레드 중 하나의 신호입니다. 리눅스의 pthread_cond_signal 문서에서

:

가 pthread_cond_signal 다시 시작 조건 변수 cond 조건 대기중인 스레드 중 하나.

대기중인 모든 스레드에 알리기 pthread_cond_broadcast. 리눅스의 pthread_cond_broadcast 문서에서

:

어떤 pthread_cond_broadcast 다시 시작 조건 변수 cond 조건 대기중인 모든 스레드.

POSIX documentations

말한다 :

어떤 pthread_cond_broadcast() 기능은 특정 조건 변수 COND 차단 모든 스레드를 차단한다.

pthread_cond_signal() 함수는 지정된 조건 변수 cond에서 차단 된 스레드 중 하나 이상을 차단 해제해야합니다 (cond에서 스레드가 차단 된 경우).


은 또한 당신은이 pthread_cond_wait()를 호출하기 전에 뮤텍스 을 잠 그려. 스레드가 대기 상태가되는 순간 mutex는 암시 적으로 잠금 해제됩니다.

또한 pthread_cond_wait()이 반환 된 후에 뮤텍스가 다시 잠 깁니다.

은이처럼 보이도록 당신이 당신의 코드를 변경할 수있는이 concpet를 따르십시오 :

pthread_mutex_lock(&(field -> print_mutex)); 

while (!field -> printed) 
{ 
    pthread_cond_wait(&(field -> print_signal), &(field -> print_mutex)); 
} 

pthread_mutex_unlock(&(field -> print_mutex)); 

또한 보호없이 플래그에 마지막으로

pthread_mutex_lock(&(field -> print_mutex)); 

field -> printed = true; 
pthread_cond_signal(&(field -> print_signal)); 

pthread_mutex_unlock(&(field -> print_mutex)); 

그리고 있는지에 하지 쓰기를 만들 이 조언을 받아보십시오 : 실제 코드에서 오류 검사를 * 모두에 추가하십시오. pthread_*() 전화!


^2 조건 및 뮤텍스가 제대로 초기화되었는지 확인 했습니까? ;-)

+0

고마워요! 모든 것이 이제 완벽하게 작동합니다 :) – Meowzen

관련 문제