생산자 스레드가 문자열에서 문자를 가져 와서 순환 연결된 목록 대기열 (5 개 노드가 큼)에 배치하는 생산자/소비자 유형을 구현하려고합니다. 소비자 스레드는 문자를 읽고이를 화면에 인쇄합니다. 두 줄은 줄 바꿈 문자에 도달하면 멈 춥니 다. 문제는 소비자 스레드가 생산자 스레드가 종료 될 때까지 시작하지 않는다는 것입니다.두 번째 스레드가 처음 완료 될 때까지 실행되지 않습니다
int consumer_thread_alive;
...
void * producer(struct Node * head)
{
while (consumer_thread_alive == 0)
{
printf("Waiting on consumer.");
}
...
}
void * consumer(struct Node * head)
{
consumer_thread_alive = 1;
...
}
...
int main(int argc, char *argv[])
{
...
consumer_thread_alive = 0;
pthread_t produce;
pthread_t consume;
printf("Creating producer thread.\n");
pthread_create(&produce, NULL, (void *) producer(&head), NULL);
printf("Creating consumer thread.\n");
pthread_create(&consume, NULL, (void *) consumer(&head), NULL);
pthread_join(produce,NULL);
pthread_join(consume,NULL);
return 1;
}
나는 다른 부분의 일부를 잘라,하지만 난 (머리 메인에서 이전에 초기화됩니다) 문제가있어 곳 이잖아. 코드를 그대로 실행하면 "Creating producer thread."가 출력됩니다. 계속해서 "Waiting on Consumer"를 인쇄합니다. Ctrl + C을 누를 때까지 중지하십시오. 또한 제작자 스레드의 맨 위에있는 루프를 제거하면 모든 반복 작업을 실행 한 다음 소비자 스레드가 호출됩니다. 어떤 이유로 든 병렬 대신 연속적으로 실행됩니다.
스레드를 일반 'int'변수와 동기화 할 수 없습니다. 적절한 동기화 프리미티브를 사용해야합니다. –
'pthread_create()'에 대한 호출이 잘못되었습니다. – alk
컴파일러의 경고를 무시하지 말고, 캐스트를 사용하여 경고를 제거하지 마십시오. (때로는 캐스트가 정확하지만 종종 진단되는 문제에 대한 잘못된 솔루션입니다. 컴파일러는 C보다 C에 대해 더 잘 압니다. –