[?] OpenMP Candados y secciones

Iniciado por edr89, 19 Febrero 2015, 01:23 AM

0 Miembros y 1 Visitante están viendo este tema.

edr89

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!!

edr89

#1
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.