Autor
|
Tema: hilos con c urge (Leído 1,839 veces)
|
vicds18
Desconectado
Mensajes: 2
|
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
Mensajes: 5
|
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
|
|
|
|
|
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
|
2 Mayo 2004, 00:20 am
por [[SpAwN]]
|
|
|
Hilos en C
Programación C/C++
|
mapers
|
2
|
6,372
|
13 Junio 2011, 10:21 am
por mapers
|
|
|
Hilos C
« 1 2 »
Programación C/C++
|
<<<-Basura->>>
|
10
|
6,163
|
27 Febrero 2013, 17:53 pm
por <<<-Basura->>>
|
|
|
Hilos
Programación C/C++
|
yabadabadu93
|
0
|
1,595
|
8 Diciembre 2015, 11:55 am
por yabadabadu93
|
|
|
Hilos en c++
Programación C/C++
|
Roast D
|
3
|
2,566
|
1 Febrero 2017, 20:45 pm
por ivancea96
|
|