[C con Clase] duda sobre hilos de e jecución

srd4121 en njit.edu srd4121 en njit.edu
Dom Dic 14 23:42:39 CET 2008


Hola Nuria,

Mensaje citado por: Núria Busom Figueres <meteorit666 en hotmail.com>:

> 
> Hola a todos, tengo una dudilla. Estoy programado en C sobre Unix i
> tengo que crear hilos, entonces uso 
> 
> #include <pthread.h>
> int pthread_create(pthread_t *restrict thread, const pthread_attr_t
> *restrict attr, void *(*start_routine)(void*), void *restrict arg);
> 
> pero la rutina que debe ejecutar mi hilo tiene dos parametros, podriais
> desirme como lo hago???
> 
> //rutina de mis hilos
> void Rutina_hilos (int A, int B);
> // creación de los hilos
> if((pthread_create(&tid[i], &attr, (void*) Rutina_hilos, (void*)
> ???)!=0) -->  tengo que pasarle 2 enteros
> 
> podeis ayudarme??
> 

Veamos. Esto tiene dos posibles arreglos:

1. Rediseña tu función, 'Rutina_hilos()', para que acepte un solo 
parámetro: 'int *' o 'void *'. Por ejemplo,

typedef void *(*FUNC_RUTINA_T)(void*);

void Rutina_hilos( int param[] );
...
int param[2];
...
param[0] = 45;
param[1] = -59;

if( !pthread_create( &tid[i], &attr, (FUNC_RUTINA_T) Rutina_hilos, (void*)
param ) )
{
...
}

2. Crear otra función que invoque a 'Rutina_hilos()' de la forma que tú 
diseñaste. Por ejemplo,

typedef void *(*FUNC_RUTINA_T)(void*);

void *Rutina_hilos( int A, int B );

/* Hacemos todo el tinglado de invocar 'Rutina_hilos()' correctamente */
void *auxRutinaHilos( void *pParam )
{
  int *ptr = (int *)pParam;
  return Rutina_hilos( ptr[0], ptr[1] );
}
...
int param[2];
...
param[0] = 45;
param[1] = -59;

if( !pthread_create( &tid[i], &attr, auxRutinaHilos, (void*)param ) )
{
...
}


Existe otra forma, pero no te puedo garantizar de que te vaya a funcionar en 
tu compilador. Esto sería invocar 'pthread_create()' directamente con ese 
array de enteros. Por ejemplo,

int param[2];
...
param[0] = 45;
param[1] = -59;

if( !pthread_create( &tid[i], &attr, (FUNC_RUTINA_T) Rutina_hilos, (void*)
param ) )
{
...
}

Como ya he dicho, esto puede o no funcionar dependiendo del compilador y 
sistema operativo que tengas, o mejor dicho la forma de invocar funciones y de 
pasar parámetros.

De todos modos, sugiero implementar una de las dos primeras soluciones, ya que 
la tercera es bastante dudosa de funcionar correctamente.


Espero que esto te sirva.

Steven





Más información sobre la lista de distribución Cconclase