2010-07-02 31 views
5

Tôi có mã này và tôi không nhận được kết quả mong đợi ... có vấn đề gì?chuyển đối số sang _beginthread() - có gì sai?

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); 
} 

Trả lời

5

arg là một biến địa phương theo quy định tại foo - nó sẽ bị tiêu diệt càng sớm càng hàm kết thúc, nhưng myFunc đó đang chạy trong thread khác vẫn sẽ phải cố gắng để truy cập nó. Bạn nên phân bổ arg trên heap và phá hủy nó trong chuỗi sau khi bạn đã hoàn tất.

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); 
} 

Cũng lưu ý rằng HANDLE phải là tất cả mũ.

+0

cảm ơn, tôi không biết làm thế nào tôi đã không nhận ra rằng tại thời điểm – emge

+0

@ Casablanca, tôi nghĩ rằng bạn đã thực hiện một lỗi đánh máy. handle = (HANDLE) _beginthread (myFunc, 0, (void *) args); /// của nó arg Cảm ơn Alok.kr. –

+0

Cảm ơn bạn đã chỉ ra điều đó, tôi đã sửa nó ngay bây giờ. – casablanca

0

Biến arg của bạn là một biến cục bộ trong hàm foo của bạn, vì vậy nó sẽ không có sẵn trong bộ nhớ sau khi hàm kết thúc.

Vì vậy, bạn có thể làm hai việc:

1. xác định biến arg của bạn trên toàn cầu.

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

hoặc bạn cũng có thể cấp phát bộ nhớ cho arg khi được trợ giúp, như casablanca đã giải thích.

Cảm ơn Alok.Kr.

Các vấn đề liên quan