2013-04-21 107 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