[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