조건부 변수를 처음 사용하고 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
입니다 (우분투) , 아무것도 인쇄하지 않습니다. 아무도 이유를 말해 줄 수 있습니까? 감사. (내 강조) 매뉴얼 페이지에서
예. _signal은 대기중인 목록에서 임의의 스레드를 깨 웁니다. 나는 무엇이든 놓친다? – luyi0619
_ "그러나 ... 아무것도 인쇄하지 않습니다."_ 정말요? 언뜻 나는 모호하다. stdout이 라인 버퍼링 (예 : 터미널)되어 있다고 가정 할 때, 프로그램이 1에서 10 라인의 출력을 인쇄 할 수 있지만 출력은 0 라인이 아닌 이유를 이해합니다. 만약 어떤 쓰레드가'main'보다 빠르다면, 적어도 하나는 시그널링되어 출력을 생성합니다. 만약 어떤 쓰레드가'main'보다 느리다면,'ready'가 준비되었음을 알게 될 것이고 각각 줄을 출력 할 것입니다. – pilcrow