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?
thử phân bổ nó trên đống? –
@Carson Tại sao điều đó tạo nên sự khác biệt? – sigjuice
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ề. –