En primer lugar es la primera vez que veo este foro, y veo que es de gran ayuda para toda la gente que tiene dudas. Muchas gracias a todos los que respondeis.
Ahora a ver si podéis ayudarme, gracias a todos.
Bien, el ejercicio trata de hacer una variante del productor consumidor, (en mi caso dos productores, 1º piezas_roja y 2º piezas_azul) con un único consumidor. Pues bien para proteger la variable numero de piezas utilizo un mutex. Para ver el estado de los buffer, tengo definidos 2 semaforos por productor, uno inicalizado a 0 ( el que me dice el número de piezas que tiene el buffer ) y el de vacio inicializado a 50 haciendo referencia a los huecos que tiene el buffer.
Bien el programa me funciona, lo que pasa es que me sigue poniendo piezas cuando llega a 50.. y no entiendo porque. Si alguien me ayuda y me dice donde está el fallo.
Un saludo! gracias a todos, aqui os dejo el codigo.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#define N 50
sem_t mutex_roja; // Se inicializa a 1
sem_t mutex_azul; // Se inicializa a 1
sem_t lleno_roja; // Se inicializa a 0 , indica cuantas piezas rojas hay en el buffer.
sem_t lleno_azul; // Se inicializa a 0 , indica cuantas piezas azules hay en el buffer
sem_t vacio_roja; // Se inicializa a 50, que son los huecos que tiene el buffer rojo
sem_t vacio_azul; // se inicializa a 50, que son los huecos que tiene el buffer azul
int entrada_roja = 0; // las piezas que he puesto rojas
int entrada_azul = 0; // las piezas que he puesto azules
int salida_roja = 0; // las piezas que salen rojas
int salida_azul = 0; // las piezas que salen azules
int buffer_roja[N] ; // buffer rojo
int buffer_azul[N] ; // buffer azul
int contador_roja = 0; // piezas que hay en el buffer rojo
int contador_azul = 0; // piezas que hay en el buffer azul
/******************************************************************************
* Funciones
******************************************************************************/
// Productor
void *productor_roja() {
int piezas_roja;
while(1) {
piezas_roja = producir_roja();
sem_wait(&vacio_roja);
sem_wait(&mutex_roja);
buffer_roja[entrada_roja] = piezas_roja;
entrada_roja = (entrada_roja + 1);
sleep(1);
printf("He producido una pieza roja \n");
contador_roja++;
sem_post(&mutex_roja);
sem_post(&lleno_roja);
}
}
void *productor_azul() {
int piezas_azul;
while(1) {
piezas_azul = producir_azul();
sem_wait(&vacio_azul);
sem_wait(&mutex_azul);
buffer_azul[entrada_azul] = piezas_azul;
entrada_azul = (entrada_azul + 1);
sleep(1);
printf("He producido una pieza azul \n");
contador_azul++;
sem_post(&mutex_azul);
sem_post(&lleno_azul);
}
}
// Consumidor
void *consumir() {
int piezas_roja;
int piezas_azul;
while(1) {
sem_wait(&lleno_roja);
sem_wait(&mutex_roja);
salida_roja = buffer_roja[salida_roja];
salida_roja = (salida_roja + 1);
printf("HE CONSUMIDO UNA PIEZA roja \n");
contador_roja = contador_roja - 1;
sleep(2);
sem_post(&mutex_roja);
sem_post(&vacio_roja);
sem_wait(&lleno_azul);
sem_wait(&mutex_azul);
salida_azul = buffer_azul[salida_azul];
salida_azul = (salida_azul + 1);
printf("HE CONSUMIDO UNA PIEZA AZUL \n");
contador_azul = contador_azul -1;
sleep(2);
sem_post(&mutex_azul);
sem_post(&vacio_azul);
consumir_azul(piezas_azul);
}
}
// Producir
int producir_roja() {
printf("Contador roja = %d \n", contador_roja);
}
int producir_azul() {
printf("Contador azul = %d \n", contador_azul);
}
// Consumir
int consumir_roja() {
printf("Contador roja = %d \n", contador_roja);
}
int consumir_azul() {
printf("Contador azul= %d \n", contador_azul);
}
/******************************************************************************
* Programa principal
******************************************************************************/
int main() {
// Iniciación de los semáforos
sem_init(&mutex_roja, 0, 1);
sem_init(&lleno_roja, 0, 0);
sem_init(&vacio_roja, 0, 50);
sem_init(&mutex_azul, 0, 1);
sem_init(&lleno_azul, 0, 0);
sem_init(&vacio_azul, 0, 50);
pthread_t consumidor;
pthread_t productor_rojas;
pthread_t productor_azules;
pthread_create(&consumidor, NULL, consumir,NULL);
pthread_create(&productor_rojas, NULL, productor_roja,NULL);
pthread_create(&productor_azules, NULL, productor_azul,NULL);
pthread_join(consumidor, NULL);
pthread_join(productor_rojas, NULL);
pthread_join(productor_azules, NULL);
return 0;
}
Ahora a ver si podéis ayudarme, gracias a todos.
Bien, el ejercicio trata de hacer una variante del productor consumidor, (en mi caso dos productores, 1º piezas_roja y 2º piezas_azul) con un único consumidor. Pues bien para proteger la variable numero de piezas utilizo un mutex. Para ver el estado de los buffer, tengo definidos 2 semaforos por productor, uno inicalizado a 0 ( el que me dice el número de piezas que tiene el buffer ) y el de vacio inicializado a 50 haciendo referencia a los huecos que tiene el buffer.
Bien el programa me funciona, lo que pasa es que me sigue poniendo piezas cuando llega a 50.. y no entiendo porque. Si alguien me ayuda y me dice donde está el fallo.
Un saludo! gracias a todos, aqui os dejo el codigo.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#define N 50
sem_t mutex_roja; // Se inicializa a 1
sem_t mutex_azul; // Se inicializa a 1
sem_t lleno_roja; // Se inicializa a 0 , indica cuantas piezas rojas hay en el buffer.
sem_t lleno_azul; // Se inicializa a 0 , indica cuantas piezas azules hay en el buffer
sem_t vacio_roja; // Se inicializa a 50, que son los huecos que tiene el buffer rojo
sem_t vacio_azul; // se inicializa a 50, que son los huecos que tiene el buffer azul
int entrada_roja = 0; // las piezas que he puesto rojas
int entrada_azul = 0; // las piezas que he puesto azules
int salida_roja = 0; // las piezas que salen rojas
int salida_azul = 0; // las piezas que salen azules
int buffer_roja[N] ; // buffer rojo
int buffer_azul[N] ; // buffer azul
int contador_roja = 0; // piezas que hay en el buffer rojo
int contador_azul = 0; // piezas que hay en el buffer azul
/******************************************************************************
* Funciones
******************************************************************************/
// Productor
void *productor_roja() {
int piezas_roja;
while(1) {
piezas_roja = producir_roja();
sem_wait(&vacio_roja);
sem_wait(&mutex_roja);
buffer_roja[entrada_roja] = piezas_roja;
entrada_roja = (entrada_roja + 1);
sleep(1);
printf("He producido una pieza roja \n");
contador_roja++;
sem_post(&mutex_roja);
sem_post(&lleno_roja);
}
}
void *productor_azul() {
int piezas_azul;
while(1) {
piezas_azul = producir_azul();
sem_wait(&vacio_azul);
sem_wait(&mutex_azul);
buffer_azul[entrada_azul] = piezas_azul;
entrada_azul = (entrada_azul + 1);
sleep(1);
printf("He producido una pieza azul \n");
contador_azul++;
sem_post(&mutex_azul);
sem_post(&lleno_azul);
}
}
// Consumidor
void *consumir() {
int piezas_roja;
int piezas_azul;
while(1) {
sem_wait(&lleno_roja);
sem_wait(&mutex_roja);
salida_roja = buffer_roja[salida_roja];
salida_roja = (salida_roja + 1);
printf("HE CONSUMIDO UNA PIEZA roja \n");
contador_roja = contador_roja - 1;
sleep(2);
sem_post(&mutex_roja);
sem_post(&vacio_roja);
sem_wait(&lleno_azul);
sem_wait(&mutex_azul);
salida_azul = buffer_azul[salida_azul];
salida_azul = (salida_azul + 1);
printf("HE CONSUMIDO UNA PIEZA AZUL \n");
contador_azul = contador_azul -1;
sleep(2);
sem_post(&mutex_azul);
sem_post(&vacio_azul);
consumir_azul(piezas_azul);
}
}
// Producir
int producir_roja() {
printf("Contador roja = %d \n", contador_roja);
}
int producir_azul() {
printf("Contador azul = %d \n", contador_azul);
}
// Consumir
int consumir_roja() {
printf("Contador roja = %d \n", contador_roja);
}
int consumir_azul() {
printf("Contador azul= %d \n", contador_azul);
}
/******************************************************************************
* Programa principal
******************************************************************************/
int main() {
// Iniciación de los semáforos
sem_init(&mutex_roja, 0, 1);
sem_init(&lleno_roja, 0, 0);
sem_init(&vacio_roja, 0, 50);
sem_init(&mutex_azul, 0, 1);
sem_init(&lleno_azul, 0, 0);
sem_init(&vacio_azul, 0, 50);
pthread_t consumidor;
pthread_t productor_rojas;
pthread_t productor_azules;
pthread_create(&consumidor, NULL, consumir,NULL);
pthread_create(&productor_rojas, NULL, productor_roja,NULL);
pthread_create(&productor_azules, NULL, productor_azul,NULL);
pthread_join(consumidor, NULL);
pthread_join(productor_rojas, NULL);
pthread_join(productor_azules, NULL);
return 0;
}