2015-01-11 3 views
3

조건부 변수를 처음 사용하고 pthread_cond_broadcast()을 사용하지 않을 경우 교착 상태가 발생합니다.pthread_cond_signal이 교착 상태를 일으키는 이유

#include <iostream> 
#include <pthread.h> 

pthread_mutex_t m_mut = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cv = PTHREAD_COND_INITIALIZER; 

bool ready = false; 

void* print_id (void *ptr) 
{ 
    pthread_mutex_lock(&m_mut); 
    while (!ready) pthread_cond_wait(&cv, &m_mut); 
    int id = *((int*) ptr); 
    std::cout << "thread " << id << '\n'; 
    pthread_mutex_unlock(&m_mut); 
    pthread_exit(0); 
    return NULL; 
} 

여기 조건이 변경되었습니다!

void go() { 
    pthread_mutex_lock(&m_mut); 
    ready = true; 
    pthread_mutex_unlock(&m_mut); 
    pthread_cond_signal(&cv); 
} 

내가 pthread_cond_broadcast(&cv);

int main() 
{ 
    pthread_t threads[10]; 

    // spawn 10 threads: 
    for (int i=0; i<10; i++) 
     pthread_create(&threads[i], NULL, print_id, (void *) new int(i)); 

    go(); 

    for (int i=0; i<10; i++) pthread_join(threads[i], NULL); 

    pthread_mutex_destroy(&m_mut); 
    pthread_cond_destroy(&cv); 

    return 0; 
} 

예상되는 대답 (임의의 순서)에 go()의 마지막 행을 변경하면 그것은 사용할 수 있습니다 내 컴퓨터에, 그러나

thread 0 

.... 

thread 9 

입니다 (우분투) , 아무것도 인쇄하지 않습니다. 아무도 이유를 말해 줄 수 있습니까? 감사. (내 강조) 매뉴얼 페이지에서

+0

예. _signal은 대기중인 목록에서 임의의 스레드를 깨 웁니다. 나는 무엇이든 놓친다? – luyi0619

+0

_ "그러나 ... 아무것도 인쇄하지 않습니다."_ 정말요? 언뜻 나는 모호하다. stdout이 라인 버퍼링 (예 : 터미널)되어 있다고 가정 할 때, 프로그램이 1에서 10 라인의 출력을 인쇄 할 수 있지만 출력은 0 라인이 아닌 이유를 이해합니다. 만약 어떤 쓰레드가'main'보다 빠르다면, 적어도 하나는 시그널링되어 출력을 생성합니다. 만약 어떤 쓰레드가'main'보다 느리다면,'ready'가 준비되었음을 알게 될 것이고 각각 ​​줄을 출력 할 것입니다. – pilcrow

답변

0

:

pthread_cond_signal 다시 시작 조건 변수 cond에 대기중인 스레드 중 하나. 에서 대기중인 스레드가 없으면 아무 일도 발생하지 않습니다. cond에서 여러 스레드가 대기중인 경우 정확하게 하나가 다시 시작되지만 지정되지 않았습니다.

pthread_cond_broadcast은 조건 변수 cond에서 대기중인 모든 스레드를 다시 시작합니다. cond에서 대기중인 스레드가 없으면 아무런 반응이 없습니다.

각 10 개의 스레드가 동일한 조건으로 대기 중입니다. 한 번만 go()이라고 부르면 main()입니다. 이 경우 pthread_cond_signal이 호출되며 이는 개의 스레드 중 하나 (임의의 것) 만 알립니다. 다른 모든 서비스는 여전히 대기 중이므로 pthread_join은 종료되지 않으므로 중단됩니다. pthread_cond_broadcast으로 전환하면 모든 스레드가 트리거됩니다.

+0

내 코드에서 스레드는 조건 변수를 기다리기 전에 뮤텍스를 획득해야합니다. 나는'cv'를 기다릴 수있는 스레드가 하나라고 생각했습니다. 맞습니까? – luyi0619

+0

예. 'pthread_cond_wait'는 뮤텍스가 엔트리에 잠겨 있고 자동으로 잠금을 해제하고 빠져 나올 때 다시 잠금을 요구합니다. – abligh

+0

흠, 나는 왜 그것이 아무것도 인쇄하지 않는지 여전히 이해하지 못합니다. 10 개의 쓰레드가'cv'를 기다리고 있습니까? 그렇다면 _signal을 사용할 수없는 이유는 무엇입니까? – luyi0619

관련 문제