2013-04-18 3 views
0

생산자 스레드가 문자열에서 문자를 가져 와서 순환 연결된 목록 대기열 (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을 누를 때까지 중지하십시오. 또한 제작자 스레드의 맨 위에있는 루프를 제거하면 모든 반복 작업을 실행 한 다음 소비자 스레드가 호출됩니다. 어떤 이유로 든 병렬 대신 연속적으로 실행됩니다.

+2

스레드를 일반 'int'변수와 동기화 할 수 없습니다. 적절한 동기화 프리미티브를 사용해야합니다. –

+3

'pthread_create()'에 대한 호출이 잘못되었습니다. – alk

+2

컴파일러의 경고를 무시하지 말고, 캐스트를 사용하여 경고를 제거하지 마십시오. (때로는 캐스트가 정확하지만 종종 진단되는 문제에 대한 잘못된 솔루션입니다. 컴파일러는 C보다 C에 대해 더 잘 압니다. –

답변

6

변경

pthread_create(&produce, NULL, (void *) producer(&head), NULL); 

가 될 :

pthread_create(&produce, NULL, producer, &head); 

(소비자에 대한 동일)


: 그리고 당신은 항상 시스템 호출의 결과를 테스트해야합니다!


그리고^2 : 예를 들어, 뮤텍스를 사용하여 consumer_thread_alive의 동시 액세스를 보호!


그리고^3 :

void * thread_func(void *); 

그래서 생산자의 스레드 기능의 구현이 같이 시작할 수 있습니다 :

void * producer(void * pvhead) 
{ 
    struct Node * head = pvhead; 
    ... 

을하지만 알고 스레드 기능 ougth는 다음과 같은 형식을 가지고 , 당신은 그대로 에 대한 참조 동일 인스턴스 struct Node 스레드 모두에뿐만를 보호해야 스레드 함수 내부 그것에 동시 액세스 있도록 (그리고 상기 ^2 참조). 구문 위

+1

+1 멋진 작업 ... –

+0

+1은이 코드와 관련된 모든 문제를 철저하고 신중하게 설명합니다. 멀티 스레딩을위한 예! –

+0

@JonathanLeffler : 감사합니다 ...--) – alk

1
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, 
      void *(*start_routine)(void*), void *restrict arg); 

pthread_create에서 #include <pthread.h> 헤더 파일을 선언한다.

은 그래서 당신은 다음은

pthread_create(&produce, NULL, producer, (void *)&head); 

전체 작업 코드를 작업을 변경해야합니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
void * producer(void *); 
void * consumer(void *); 
struct node{ 
int x; 
}; 
struct node head; 
int consumer_thread_alive; 
void * producer(void * head) 
{ 
    printf("producer\n"); 
    pthread_exit(NULL);  
} 
void * consumer(void * head) 
{ 
    consumer_thread_alive = 1; 
    printf("consumer\n"); 
    pthread_exit(NULL); 
} 

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, producer, (void*)&head); 
    printf("Creating consumer thread.\n"); 
    pthread_create(&consume, NULL, consumer, (void*)&head); 
    pthread_join(produce,NULL); 
    pthread_join(consume,NULL); 
    return 1; 
} 
0
pthread_create(//producer's) 
pthread_join(//producer's) 
pthread_create(//consumer's) 
pthread_join(//consumer's) 

이 순서가 작동합니다.

편집 : 이것은 동일한 것을 구현하려고 할 때 작동했습니다. 한번 시도해보십시오.

+0

아니오; 이것은 합리적인 것이 아닙니다. 생성자는 소비자가 시작될 때까지 종료되지 않으므로 처음에는 조인이 작동하지 않습니다. –

관련 문제