2013-09-25 2 views
0

다른 스레드가 가변 플래그를 사용하지 않으면 마스터 스레드가 깨우기 신호를 놓치지 않도록하는 안전한 방법입니까?cond 신호가 누락되지 않도록하는 안전한 방법

void *Cancel_master_thread(void *arg) 
{ 
    while (1) 
    { 
    flag = 0; 
    pthread_mutex_lock(&cancel_in_progress); 
    flag = 1; 
    pthread_cond_wait(&cancel_finished, &cancel_in_progress); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 

void *Cancel_slave_MB() 
{ 
    while (1) 
    { 
    while (flag != 1) 
    { 
    } 

    pthread_mutex_lock(&cancel_in_progress); 
    pthread_cond_signal(&cancel_finished); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 

답변

0

마스터의 플래그를 변경 한 후에는 마스터가 실행할 수 있도록 프로세서를 양보해야합니다. (보통 스레딩과 멀티 프로세서에 관해서는 오랜 토론이 있습니다.) 그래서 마스터가 작동 할 수 있도록 sleep (sleep)과 같은 어떤 종류의 호출을하고 싶습니다. 현재, Cancel_slave_MB는 긴밀한 루프에서 실행되므로 다른 어떤 것도 실행할 기회가 없습니다.

EDIT 예를 들어 조금 베어 본 것입니다. 중단 점 또는 printf (잠긴 영역 외부)를 설정하면 제대로 실행됩니까? 영원히 반복하지 말라는 말은 세마포어의 핵심입니다.

+0

을하지만 내가 원하는 건 잠을 마스터입니다 슬레이브로부터의 신호가 도착한다. 따라서 플래그가 값 1을 얻으면 마스터는 잠자기 상태가되고 슬레이브 만 뮤텍스를 잠그고 신호를 보낼 수 있습니다. 맞지 않아? 다중 프로세서 시스템의 경우 스레드가 동시에 실행됩니다. 그렇다면 문제는 어디에 있습니까? 뮤텍스 cancel_in_progress의 잠금을 해제 한 후에 슬레이브가 잠자기 상태가되었음을 언급하는 것을 잊어 버렸습니다. 게시 된 코드에서 pthread_cond_wait 명령을 결론 지우지 않았습니다. – iiirxs

+0

예 그들은 오랜 시간 동안 제대로 실행되지만 어떻게 든 마스터 스레드가 일어나서 모든 것이 멈 춥니 다. – iiirxs

0

당신의 들여 쓰기 인 경우 그 cancel_master_thread() 수행 정확히 하나의 pthread_cond_wait()pthread_cond_signal()cancel_slave_MB()에서 (동안 while -loop에서) 다음에게 다음과 같은 방법으로 수행

void * cancel_master_thread(void *arg) 
{ 
    pthread_mutex_lock(&cancel_in_progress); 

    while (1) 
    { 
    pthread_cond_wait(&cancel_finished, &cancel_in_progress); 

    /* do something per signal received */ 
    } 

    pthread_mutex_unlock(&cancel_in_progress); 
} 

void * cancel_slave_MB() 
{ 
    while (1) 
    { 
    /* do something */ 

    pthread_mutex_lock(&cancel_in_progress); 
    pthread_cond_signal(&cancel_finished); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 
+0

이 코드의 핵심은 무엇입니까? 모든 마스터 스레드는 잠을 자면 잠을 자야한다는 것을 의미합니다. – iiirxs

+0

@iiirxs : 물론 가능하지만 마스터는 각 신호에서 깨어나 신호를 놓치지 않습니다. 내가 게시 한 코드의 의도가 무엇인지 이해하지 못했을 수 있습니다. – alk