elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  hilos con c urge
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: hilos con c urge  (Leído 1,839 veces)
vicds18

Desconectado Desconectado

Mensajes: 2


Ver Perfil
hilos con c urge
« 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;


}


En línea

moncker94

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: hilos con c urge
« Respuesta #1 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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Más información en los hilos.
Sugerencias y dudas sobre el Foro
oklopo 1 2,246 Último mensaje 2 Mayo 2004, 00:20 am
por [[SpAwN]]
Hilos en C
Programación C/C++
mapers 2 6,372 Último mensaje 13 Junio 2011, 10:21 am
por mapers
Hilos C « 1 2 »
Programación C/C++
<<<-Basura->>> 10 6,163 Último mensaje 27 Febrero 2013, 17:53 pm
por <<<-Basura->>>
Hilos
Programación C/C++
yabadabadu93 0 1,595 Último mensaje 8 Diciembre 2015, 11:55 am
por yabadabadu93
Hilos en c++
Programación C/C++
Roast D 3 2,566 Último mensaje 1 Febrero 2017, 20:45 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines