Preguntasobre linux. (hilos)

bLaCkH0Le

hola miren estoy aki liado con una practica de linux ymepiden crear dos hilos, uno que ejecute uncontador quese vaya incrementando yotroparalelo que recoja caracteres desde teclado siempre que seadistinto de 0. Cuando sea 0 terminan ambos hilos. Me da un problema la funcion delcrear hilo y es que nose claramente que e de pasarle. Haber si me podeis ayudar. Os paso el Codigo.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cont=0,fin=0; // variables contador y fin para indicar salida prog
pthread_t hilo1,hilo2; // creacion de los 2 hilos

void contador()
{

if(fin==0)
{
printf("valor del contador %d \n",cont);
cont++;

sleep(1);
}

}

void lectura()
{
if(fin==0)
{
char c,c1='0';
while(read(0,&c,1)==1)
{
if(strcmp(&c,&c1)==0)
fin=1;
}
}

}


int main(void)
{

while(fin==0)
{
phtread_create(&hilo1,NULL,contador(),NULL);
phtread_create(&hilo2,NULL,lectura(),NULL);
}

return 0;
}

maRc

Quita los () de contador() y lectura().

javithelong

No piloto mucho de hilos, pero lo que dice #2 tiene buena pinta. Y también, la funcion no es pthread_create? lee bien que la has escrito mal xD si tu codigo es:

while(fin==0)
{
phtread_create(&hilo1,NULL,contador(),NULL);
phtread_create(&hilo2,NULL,lectura(),NULL);
}

Prueba con:

while(fin==0)
{
pthread_create(&hilo1,NULL,contador,NULL);
pthread_create(&hilo2,NULL,lectura,NULL);
}

bLaCkH0Le

Buenas! ante todo gracias por la ayuda. Tengo un problemilla y es que en casa el compilador de c de linux creo que no viene. De donde puedo bajar los "packages" ?? tengo la version de ubuntu. Es que siempre lo hago desde la universidad y queria comprobar esto. Gracias ante todoo!

maRc

sudo apt-get install gcc

bLaCkH0Le

ya me va rulando esto. Tengo un problemilla. A la hora de leer el hilo 2 desde teclado. Como se hacia para que lea un caracter desde teclado y si no es 0 que siga.

De otro modo dicho. El contador cada segundo se ira incrementando, por otra parte el hilo 2 ira pidiendo desde teclado que metas cosas. el problema es que no se como leer desde teclado.

Pr0xNT4

getch(), getche() getchar().. lees de teclado

LOc0

Aprovecho este hilo para prguntar si sabéis de alguna forma de comunicar hilos entre sí SIN USAR variables globales

Dejo ejemplo:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

//Variable GLOBAL para comunicación entre hilo principal y paralelo
int tiempo_espera=500;

DWORD WINAPI Contador(void *parametro)
{

int n=0;

while(tiempo_espera>0)
{
printf("\n%d (%d ms)\n", n, tiempo_espera);
sleep(tiempo_espera);
n++;
}

printf("FIN HILO PARALELO\n");

return 0;
}

int main()
{
HANDLE h_HandleHilo;
DWORD identificador_hilo;

h_HandleHilo=CreateThread(NULL,0, Contador,NULL,0,&identificador_hilo);


int n=0;
char eso='0';


while(eso!='*')
{
fflush(stdin);
eso=getch();


if(eso=='+' && tiempo_espera>100)
{
    tiempo_espera-=100;
    printf("Acelerando...\n", eso);
}
else if(eso=='-')
{
    tiempo_espera+=100;
    printf("Frenando...\n", eso);
}
else
   printf("Has pulsado %c\n", eso);

}


tiempo_espera=-1;


printf("FIN HILO PRINCIPAL\n");


return 0;
}[/i]

Dos hilos. Hay un contador en paralelo con el hilo principal que va recogiendo datos y en función de la tecla pulsada acelera/frena el contador hasta que se pulsa * que terminan los dos hilos.

Bien, ¿habría alguna manera de mandarle el tiempo_espera al hilo paralelo sin tener que usar variables globales?

Salu2 ;)

maRc

La declaras en el main y le pasas la dirección al CreateThread en el cuarto parámetro.

int tiempo_espera = 500;
...
h_HandleHilo=CreateThread(NULL,0, Contador,&tiempo_espera,0,&identificador_hilo);

Si necesitas pasarle más de un parámetro, creas una estructura y punto ;)

PD: Si la modificas también deberías crear algo para la secció crítica (lo mejor, un objeto tipo CRITICAL_SECTION).

LOc0

Joer, qué raro, leyendo en la documentación de MSDn vi que se hacía así. Lo hice, pero me fallaba el hilo paralelo.

Ahora voy, lo repito y me funciona :O

De todas formas, no consigo quitarme de encima este warning -->
[Warning] passing arg 3 of `CreateThread' from incompatible pointer type

Declaro así:
DWORD WINAPI Contador(int *tiempo_espera)

y luego en el main declaro el int tiempo espera y le mando el puntero.

Bueno, pero funciona, que no es poco xD

Salu2 y gracias ;)

Usuarios habituales

  • LOc0
  • maRc
  • Pr0xNT4
  • bLaCkH0Le
  • javithelong