2013-04-21 1 views
0

안녕하세요 저는 생산자 - 소비자 문제를 해결하기위한 알고리즘을 작성하려고하는데로드 블록을 쳤습니다.생산자 - 소비자 문제

생산 : 6 6 0 0 0 0 0 0 0 0 0 END

후 프로그램이 종료 이것은 내 코드에서 무엇입니까 출력됩니다. 내가 어디로 잘못 갔는지 모르겠다. 순환 버퍼를 만드는 데 잘못된 것이 있습니까?

#include <iostream> 
#include <pthread.h> 
#include <semaphore.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string> 
#include <fstream> 
using namespace std; 

#define BUFFER_SIZE 10 

void *produce(void *); 
void *consume(void *); 
int produceItem(void); 
void insertItem(int item); 
void removeItem(void); 
void printBuffer(void); 

int head = 0; 
int tail = 0; 
int item; 
int bufferCount = 0; 
pthread_t producer, consumer; 
pthread_cond_t Buffer_Not_Full=PTHREAD_COND_INITIALIZER; 
pthread_cond_t Buffer_Not_Empty=PTHREAD_COND_INITIALIZER; 
pthread_mutex_t lock; 
sem_t sem_filledSlots; 
sem_t sem_emptySlots; 
int buffer[BUFFER_SIZE]; 


int main() { 

    int emptyCount; 
    int item; 
    srand (time(NULL)); 


    sem_init(&sem_filledSlots, 0, 0); 
    sem_init(&sem_emptySlots, 0, BUFFER_SIZE); 

    sem_getvalue(&sem_emptySlots, &emptyCount); 


    pthread_create (&producer, NULL, &produce, NULL); 
    pthread_create (&consumer, NULL, &consume, NULL); 


    return 0; 
} 

void *produce(void *) 
{ 

    for(int i = 0; i <15; i++) 
    { 
     item = produceItem(); 
     sem_wait(&sem_emptySlots); 
     pthread_mutex_lock(&lock); 
     printf("Producing: %d \n", item); 
     buffer[head] = item; 
     head = (head + 1) % BUFFER_SIZE; 
     printBuffer(); 
     pthread_mutex_unlock(&lock); 
     sem_post(&sem_filledSlots); 
    } 
} 

void *consume(void *) 
{ 
    for(int i = 0; i <15; i++) 
    { 
     sem_wait(&sem_filledSlots); 
     pthread_mutex_lock(&lock); 
     printf("Consuming %d \n", buffer[tail]); 
     buffer[tail] = 0; 
     tail = (tail + 1) % BUFFER_SIZE; 
     bufferCount--; 
     printBuffer(); 
     pthread_mutex_unlock(&lock); 
     sem_post(&sem_emptySlots); 
    } 
} 

int produceItem(void) 
{ 

    int x = (rand()%11 + 1); 
    return x; 
} 

void printBuffer(void) 
{ 

    for(int i = 0; i <BUFFER_SIZE; i++) 
    { 

     printf("%d ", buffer[i]); 

    } 
    printf("END \n"); 
} 

답변

0

당신은 프로그램 종료하기 전에 pthread_join을 누락하고 있습니다 :

.... 위해 pthread_join (프로듀서, NULL을); pthread_join (소비자, NULL); return 0; ....

+1

감사합니다. 신의 어머니 감사합니다. – user2134127