2013-04-21 109 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(consumer,NULL); return 0; ....

+1

非常感谢上帝之父谢谢您 – user2134127 2013-04-21 22:26:16