Hola, tengo el siguiente programa donde servidor genera números y cliente imprime los datos recibidos, es decir, el cliente emite una petición, el servidor la lee, genera un numero y lo regresa al cliente, este ultimo lee el dato recibido.
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define NHILOS 2
void servidor();
void cliente();
int produce(int pet);
void lee(int prod);
int pet=0, prod=0;
omp_lock_t C1; //Candado Servidor
omp_lock_t C2; //Candado Cliente
int main (int argc, char *argv[])
{
int id;
srand (time(NULL));
omp_init_lock(&C1);
omp_init_lock(&C2);
omp_set_lock(&C1);
omp_set_lock(&C2);
omp_set_num_threads(NHILOS);
#pragma omp parallel sections shared(pet,prod)
{
#pragma omp section
{
printf(" Serv_id: %d\n",omp_get_thread_num());
servidor();
}
#pragma omp section
{
printf("Clie_id: %d\n",omp_get_thread_num());
cliente();
}
}
return 0;
}
void servidor()
{
while(1)
{
omp_set_lock(&C1);
prod = produce(pet);
omp_unset_lock(&C2);
}
}
void cliente()
{
while(1)
{
pet = rand()%3;
printf("Cliente genera la peticion: %d\n",pet);
omp_unset_lock(&C1);
omp_set_lock(&C2);
lee(prod);
sleep(2);
}
}
int produce(int pet)
{
printf("Procesando petición: %d\n",pet);
prod++;
return prod;
}
void lee(int prod)
{
printf("El servidor envia el producto: %d\n",prod);
}
¿Cómo puedo implementar N clientes y 1 servidor? Ahora se tienen N tareas cliente() y un solo servidor que queda en espera de peticiones de algún cliente.¿Cómo creo las N tareas, sin mas con N hilos?
Ahora se tienen 3 candados: Cliente, Petición y Servidor y la funcion cliente es mas o menos asi:
void cliente()
{
while(1)
{
omp_set_lock(&C3); //Peticion
pet = rand()%3;
printf("Cliente genera la peticion: %d\n",pet);
omp_unset_lock(&C1); //Servidor
omp_set_lock(&C2); //Cliente
lee(prod);
omp_unset_lock(&C3)
sleep(2);
}
}
Ya tengo las partes solo que no se como conectarlas, saludos!!
Estoy probando con distintas secciones pero un mismo cliente siempre hace peticiones, no les deja a los demas intentar :o
[re-ACTUALIZO] Hay un error, al iniciar #pragma omp parallel todos los hilos ejecutan cliente, por lo tanto no hay un solo servidor y todos quedan en espera.
En base al id se asigna el servidor y el resto son clientes, tambien hay que reajustar los candados o se seguira bloqueando, el detalle es que solo un hilo hace de servidor y el resto son clientes que hacen peticiones.
#pragma omp parallel private(id) shared(pet,prod)
{
id = omp_get_thread_num(); //Numero de cada hilo
if(id==0)
{servidor(id);}
cliente(id);
}
saludos.