Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: vicds18 en 5 Diciembre 2017, 10:38 am



Título: hilos con c urge
Publicado por: vicds18 en 5 Diciembre 2017, 10:38 am
Buenas no puedo hacer que pase a mi segundo hilo



codigo:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <pthread.h>
#include <windows.h>



pthread_mutex_t candado1=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t candado2=PTHREAD_MUTEX_INITIALIZER;


pthread_cond_t condv1=PTHREAD_COND_INITIALIZER;
pthread_cond_t condv2=PTHREAD_COND_INITIALIZER;



int ElementoA=0, Creacion_de_elementos_de_A=0;
int ElementoB=0, Creacion_de_elementos_de_B=0;

void * Hilo1(void *arg)
{



   while(1)
    {



        if(0<=ElementoA){
    Creacion_de_elementos_de_A=ElementoA++;
        printf("Hilo1: Elemento A creado\n",ElementoA);
        Sleep(1000);

        }



        if(3 == ElementoA){

        printf("Hilo1:Se lleno la pila\n",ElementoA);
        Sleep(1000);
        printf("Hilo1:Se va a vaciar la pila\n",ElementoA);

        Sleep(1000);

        break;

        }





    }

   pthread_exit(NULL);
return 0;
}

void * Hilo2(void *arg)
{



    while(1)

    {



  pthread_mutex_lock(&candado1);
  pthread_cond_wait(&condv1,&candado1);
  pthread_mutex_unlock(&candado2);
        if(0>=ElementoB){



               Creacion_de_elementos_de_B=ElementoB++;
            printf("Hilo2: Elemento B creado\n",ElementoB);

        }

             if(3== ElementoB ){

            printf("Hilo2: Se lleno la pila\n",ElementoB);

            Sleep(1000);
            printf("Hilo2:Se va a vaciar la pila\n",ElementoB);
            }

    pthread_mutex_lock(&candado1);
    pthread_cond_signal(&condv2);
    pthread_mutex_unlock(&candado2);
    }


   pthread_exit(NULL);
   return 0;
}


int main(void)
{

    pthread_t IdHilo1, IdHilo2;


    printf("Inicia produccion()\n");
srand(time(NULL));

  pthread_mutex_init(&candado1,NULL);
      pthread_mutex_init(&candado2,NULL);

    pthread_create(&IdHilo1,NULL,Hilo1,NULL);
    pthread_create(&IdHilo2,NULL,Hilo2,NULL);


    pthread_join(IdHilo1,NULL);
    pthread_join(IdHilo2,NULL);

      pthread_mutex_init(&candado1,NULL);
      pthread_mutex_init(&candado2,NULL);


    return 0;


}


Título: Re: hilos con c urge
Publicado por: moncker94 en 6 Diciembre 2017, 12:35 pm
Buenas vicds,


[1] Para empezar

Te recomiendo cuando realices una consulta que seas mucho más concreto. La idea de "Buenas no puedo hacer que pase a mi segundo hilo" es muy vaga y a penas nos permite trabajar con tu problema. Haciendo la tarea de ayuda más compleja y, en muchas ocasiones, dejándola sin contestar.



[2]Concibiendo tu problema

Supongo que tu problema es que el hilo 2 no llega a leer su función... Aquí llega otro problema de forma: no sé si el hilo 1 acaba, se bloquea... Me faltan datos. Sin embargo, consideraré que acaba, fallando realmente el mutex más que el hilo 2.

El primer y gran fallo del código es utilizar dos mutex. Muy rara es la vez que esto es funcional, y mucho menos cómo estás intentando hacerlo funcionar. Analicemos un momento lo que tratas de hacer:

[2-a] Idea de mutex

El mutex es un mecanismo de sincronización que presentan, junto las variables de condición, los hilos. El problema de sincronía nace cuando varios hilos toman un recurso o variable compartido pudiendo producir un error conocido como condiciones de carrera.

Tu concepción de mutex es incorrecta. Utilizas dos mutex diferentes tratando que uno produzca el "lock" y otro el "unlock" cuando estas funciones de forma binomial actúan sobre el mismo mutex.




[3] Solución parcial a tu problema

[3-a] Te recomiendo, para empezar, que concibas de diferente manera el Mutex, comprendiéndolo como una sola estructura que protege la zona crítica impidiendo las condiciones de carrera.

[3-b] El wait no se coloca, por formulación, como una linea de código más. Se trata de un línea de código siempre encerrada en un bucle while sobre una condición de las variables compartidas.




[4] Conclusión

Analiza MUCHO mejor la teoría sobre los ejercicios que tienes que realizar. Realmente falta mucha comprensión sobre este temario, te recomiendo que mires y remires ejercicios ya realizados e intentes comprender la teoría. Existen demasiados errores para comprender el ejercicio, analizarlos todos y dar una solución completa.


Saludos y siento que no pueda serte de más ayuda,

moncker94