2011-11-22 40 views
8

Estoy tratando de pasar dos parámetros a un hilo en C. He creado un conjunto (del tamaño 2) y estoy tratando de pasar ese conjunto al hilo. ¿Es este el enfoque correcto para pasar múltiples parámetros a un hilo?Cómo pasar múltiples parámetros a un hilo en C

// parameters of input. These are two random numbers 
int track_no = rand()%15; // getting the track number for the thread 
int number = rand()%20 + 1; // this represents the work that needs to be done 
int *parameters[2]; 
parameters[0]=track_no; 
parameters[1]=number; 

// the thread is created here 
pthread_t server_thread; 
int server_thread_status; 
//somehow pass two parameters into the thread 
server_thread_status = pthread_create(&server_thread, NULL, disk_access, parameters); 
+1

Compruebe el código que se está declarando una matriz de punteros a int y asignar ellos con valores int. – Teudimundo

+0

Me di cuenta de que la advertencia. ¿Sería legítimo que los parámetros no sean punteros y simplemente una matriz? –

+0

si declara el parámetro como una matriz de int ("int parámetro [2];"), puede pasar el parámetro como un puntero. Es el puntero al primer int. A continuación, puede acceder desde el hilo como una matriz. – Teudimundo

Respuesta

15

Dado que se pasa en un puntero nulo, se puede apuntar a cualquier cosa, incluyendo una estructura, según el siguiente ejemplo:

typedef struct s_xyzzy { 
    int num; 
    char name[20]; 
    float secret; 
} xyzzy; 

xyzzy plugh; 
plugh.num = 42; 
strcpy (plugh.name, "paxdiablo"); 
plugh.secret = 3.141592653589; 

status = pthread_create (&server_thread, NULL, disk_access, &plugh); 
// pthread_join down here somewhere to ensure plugh 
// stay in scope while server_thread is using it. 
+3

Por supuesto, en el código como se muestra en el ejemplo anterior, debe asegurarse de que la estructura no se destruya mientras el hilo intenta desreferenciar el opinter dado. –

+0

La solución más fácil es 'malloc' la estructura y hacer que el nuevo hilo sea responsable de liberarlo. Otro enfoque es colocar una barrera dentro de la estructura y tener tanto el hilo original como el nuevo esperar en la barrera antes de que regrese el hilo original. –

+0

@FrerichRaabe Quizás una pregunta estúpida, pero ¿cómo se destruye la estructura ... aparte de una llamada a 'free()' (si fue 'malloc'ed) o la función que regresa (si se asignó en el pila), ¿hay alguna otra manera? – The111

1

Esa es una forma. El otro habitual es pasar un puntero a struct. De esta forma puede tener diferentes tipos de "parámetros", y los parámetros se nombran en lugar de indexarse, lo que puede hacer que el código sea más fácil de leer/seguir algunas veces.

Cuestiones relacionadas