2010-07-02 15 views
5

Tengo este código y no estoy obteniendo los resultados esperados ... ¿Qué pasa?pasando argumentos a _beginthread() - ¿Qué pasa?

typedef struct { 
    int data1; 
    int data2; 
}t; 

void foo(int a, int b) { 

    Handle handle; 
    t arg; 
    arg.data1 = a; 
    arg.data2 = b; 
    handle = (HANDLE) _beginthread(myFunc, 0, (void*) &arg); 
} 

void myFunc(void *param) { 
    t *args = (t*) param; 
    int x = args->data1; 
    int y = args->data2; 
    printf("x=%d, y=%d\n", x, y); 
} 

Respuesta

5

arg es una variable local se define en foo - sería destruida tan pronto como termine esa función, pero myFunc que se está ejecutando en otro hilo todavía estaría tratando de acceder a él. Debe asignar arg en el montón y destruirlo en el hilo una vez que haya terminado.

void foo(int a, int b) { 
    HANDLE handle; 
    t *arg; 
    arg = (t *)malloc(sizeof(t)); 
    arg->data1 = a; 
    arg->data2 = b; 
    handle = (HANDLE) _beginthread(myFunc, 0, (void*) arg); 
} 

void myFunc(void *param) { 
    t *args = (t*) param; 
    int x = args->data1; 
    int y = args->data2; 
    printf("x=%d, y=%d\n", x, y); 
    free(args); 
} 

También tenga en cuenta que debe haber HANDLE todas las tapas.

+0

gracias, no sé cómo no me di cuenta de que en el momento – emge

+0

@ Casablanca, creo que cometió un error tipográfico. handle = (HANDLE) _beginthread (myFunc, 0, (void *) args); /// its arg Gracias Alok.kr. –

+0

Gracias por señalarlo, lo he corregido ahora. – casablanca

0

su variable arg es una variable local en su función foo, por lo que no estará disponible en la memoria una vez que la función termine.

por lo que puede hacer dos cosas:

1.Define la variable arg a nivel mundial.

typedef struct { 
    int data1; 
    int data2; 
}t; 
t arg; 

o también puede asignar la memoria para arg en la ayuda, como ha explicado Casablanca.

Gracias Alok.Kr.

Cuestiones relacionadas