2012-06-28 18 views
5

Estoy tratando de crear un hilo y de lo que recuerdo esto debe ser la forma correcta de hacerlo:pthread_create no funciona. se pasa el argumento 3 advertencia

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

int SharedVariable =0; 
void SimpleThread(int which) 
{ 
    int num,val; 
    for(num=0; num<20; num++){ 
     if(random() > RAND_MAX/2) 
      usleep(10); 
     val = SharedVariable; 
     printf("*** thread %d sees value %d\n", which, val); 
     SharedVariable = val+1; 
    } 
    val=SharedVariable; 
    printf("Thread %d sees final value %d\n", which, val); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0; t< NUM_THREADS; t++){ 
     printf("In main: creating thread %ld\n", t); 
     rc = pthread_create(&threads[t], NULL, SimpleThread, (void*)t); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 

    /* Last thing that main() should do */ 
    pthread_exit(NULL); 
} 

Y el error que estoy recibiendo es éste:

test.c: En la función 'main': test.c: 28: warning: pasando el argumento 3 de 'pthread_create' desde el tipo de puntero incompatible /usr/include/pthread.h:227: nota: expected 'void * (* ) (void *) 'pero el argumento es del tipo' void (*) (i nt) '

No puedo cambiar la función SimpleThread por lo que cambiar el tipo de parámetro no es una opción aunque ya lo intenté y tampoco funcionó.

¿Qué estoy haciendo mal?

Respuesta

12

SimpleThread debe declararse como

void* SimpleThread(void *args) { 
} 

Cuando se pasan parámetros a su hilo, lo mejor es definir un struct para ellos, pasar un puntero a que struct como void*, y echó de nuevo a el tipo correcto dentro de la función.

+0

Intenté hacerlo pero luego recibo errores cada vez que uso el int que – randomizertech

+1

@ fgualda87 Como un temporizador rápido puede pasar 'int' como' void * '- solo para asegurarse de que su código funcione. Agregue 'int which = (int) args;', y el código debería compilarse y ejecutarse. Sin embargo, debería considerar envolver ese 'int' en una' struct'. – dasblinkenlight

+0

¡Perfecto funcionó! ¿Hay alguna manera de hacer esto sin cambiar el método SimpleThread? – randomizertech

3

Aquí hay una versión compiladora y "operativa" de su programa, aunque debo admitir que no sé exactamente qué está haciendo. Para los críticos del público, me disculpo por adelantado por el loop pthread_join al final.

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

#define NUM_THREADS 5 

struct my_thread_info { 
    long which; 
}; 

int SharedVariable = 0; 

void *SimpleThread(void *data) 
{ 
    int num, val; 
    struct my_thread_info *info = data; 

    for (num = 0; num < 20; num++) { 
     if (random() > RAND_MAX/2) 
      usleep(10); 
     val = SharedVariable; 
     printf("*** thread %ld sees value %d\n", info->which, val); 
     SharedVariable = val + 1; 
    } 

    val = SharedVariable; 
    printf("Thread %ld sees final value %d\n", info->which, val); 

    free(info); 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    struct my_thread_info *info; 
    for (t = 0; t < NUM_THREADS; t++) { 
     printf("In main: creating thread %ld\n", t); 

     info = malloc(sizeof(struct my_thread_info)); 
     info->which = t; 

     rc = pthread_create(&threads[t], NULL, SimpleThread, info); 
     if (rc) { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } 
    } 

    for (t = 0; t < NUM_THREADS; t++) { 
     pthread_join(threads[t], NULL); 
    } 
} 
+0

hace esto? su función SimpleThread no tiene retorno. – IanNorton

+0

Extrañamente, sí. Lo agregaré sin embargo. –

+0

No, esto cambia demasiado mi método SimpleThread. ¡Gracias! – randomizertech

Cuestiones relacionadas