Производитель-потребительский выпуск

Привет, я пытаюсь написать алгоритм для решения проблемы производителя и потребителя, и я наткнулся на контрольно-пропускной пункт. Это вывод, который я получаю из моего кода:

Производство: 6
6 0 0 0 0 0 0 0 0 0 КОНЕЦ

и затем программа выходит. Я не уверен, где я ошибся? Я сделал что-то не так при создании кругового буфера?

#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);
вернуть 0;
….

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]