2009-08-30 41 views
65

Tôi cần chuyển nhiều đối số cho hàm mà tôi muốn gọi trên một chuỗi riêng biệt. Tôi đã read rằng cách điển hình để làm điều này là định nghĩa một cấu trúc, chuyển hàm đó một con trỏ tới đó và dereference nó cho các đối số. Tuy nhiên, tôi không thể có được điều này để làm việc:Nhiều đối số cho hàm được gọi bởi pthread_create()?

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

struct arg_struct { 
    int arg1; 
    int arg2; 
}; 

void *print_the_arguments(void *arguments) 
{ 
    struct arg_struct *args = (struct arg_struct *)args; 
    printf("%d\n", args -> arg1); 
    printf("%d\n", args -> arg2); 
    pthread_exit(NULL); 
    return NULL; 
} 

int main() 
{ 
    pthread_t some_thread; 
    struct arg_struct args; 
    args.arg1 = 5; 
    args.arg2 = 7; 

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) { 
     printf("Uh-oh!\n"); 
     return -1; 
    } 

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */ 
} 

Kết quả cho điều này nên là:

5 
7 

Nhưng khi tôi chạy nó tôi thực sự nhận được:

141921115 
-1947974263 

Bất cứ ai cũng biết những gì tôi đang làm sai?

+1

thử phân bổ nó trên đống? –

+1

@Carson Tại sao điều đó tạo nên sự khác biệt? – sigjuice

+5

Cấu trúc của bạn nên tồn tại ít nhất là miễn là chủ đề của bạn. Nếu bạn đang tạo một luồng và trả về từ hàm được gọi là pthread_create(), cấu trúc được cấp phát trên ngăn xếp có thể bị ghi đè bởi dữ liệu khác và có thể gây ra các sự cố trong hàm chuỗi của bạn. Trong ví dụ này, đó không phải là một vấn đề, kể từ khi tạo thread chờ cho thread công nhân để hoàn thành trước khi trở về. –

Trả lời

58

Bởi vì bạn nói

struct arg_struct *args = (struct arg_struct *)args;

thay vì

struct arg_struct *args = arguments;

+0

Chà. Duh. Cảm ơn. – Michael

+2

Làm cho tôi tự hỏi làm thế nào nó biên dịch thành công ở nơi đầu tiên ... –

+2

@ sigjuice, Nó không làm việc cho tôi. Tôi thấy lỗi biên dịch: chuyển đổi không hợp lệ từ ‘void *’ thành ‘arg_struct *’. – Neshta

4

main() đã nó thread riêng và ngăn xếp biến. hoặc cấp phát bộ nhớ cho 'args' trong đống hoặc làm cho nó toàn cầu:

struct arg_struct { 
    int arg1; 
    int arg2; 
}args; 

//declares args as global out of main() 

Sau đó, tất nhiên thay đổi các tham chiếu args->arg1-args.arg1 vv ..

15

sử dụng

struct arg_struct *args = (struct arg_struct *)arguments; 

ở vị trí của

struct arg_struct *args = (struct arg_struct *)args; 
2

Sử dụng:

struct arg_struct *args = malloc(sizeof(struct arg_struct)); 

Và chuyển thông tin này lập luận như thế này:

pthread_create(&tr, NULL, print_the_arguments, (void *)args); 

Đừng quên args miễn phí! ;)

0

Các args của print_the_arguments là tranh luận, vì vậy bạn nên sử dụng:

struct arg_struct *args = (struct arg_struct *)arguments. 
Các vấn đề liên quan