Potrzebuję przekazać wiele argumentów do funkcji, które chciałbym wywołać w osobnym wątku. Mam read, że typowym sposobem, aby to zrobić, jest zdefiniowanie struktury, przekazanie funkcji wskaźnika do niej i usunięcie jej z argumentów. Jednak nie jestem w stanie uzyskać to do pracy:Wiele argumentów funkcji wywołanych przez 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 */
}
Wyjście na to powinno być:
5
7
Ale kiedy go uruchomić I rzeczywiście dostać:
141921115
-1947974263
Ktoś wie co robię źle?
spróbować przeznaczając go na stercie? –
@Carson Dlaczego to ma znaczenie? – sigjuice
Twoja struktura powinna żyć co najmniej tak długo jak wątek. Jeśli tworzysz wątek i wracasz z funkcji o nazwie pthread_create(), struktura przydzielona na stosie może zostać nadpisana przez inne dane i może spowodować problemy w funkcji wątku. W tym przykładzie nie stanowi to problemu, ponieważ wątek tworzenia czeka na zakończenie wątku roboczego przed powrotem. –