2009-08-30 16 views
65

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?

+1

spróbować przeznaczając go na stercie? –

+1

@Carson Dlaczego to ma znaczenie? – sigjuice

+5

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. –

Odpowiedz

58

Ponieważ mówisz

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

zamiast

struct arg_struct *args = arguments;

+0

Wow. Duh. Dzięki. – Michael

+2

Sprawia, że ​​zastanawiam się, w jaki sposób skompilowane pomyślnie na pierwszym miejscu ... –

+2

@ sigjuice, To nie działa dla mnie. Widzę błąd kompilacji: nieprawidłowa konwersja z "void *" do "arg_struct *". – Neshta

4

main() ma swój własny wątek i stosu zmiennych. albo przydzielić pamięci dla 'args' w kupie lub sprawiają, że globalny:

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

//declares args as global out of main() 

Potem oczywiście zmienić referencje od args->arg1 do args.arg1 etc ..

15

użycie

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

zamiast

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

Zastosowanie:

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

I przekazać to argumenty takie jak ten:

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

Nie zapomnij bezpłatne args! ;)

0

args z print_the_arguments to argumenty, więc należy używać:

struct arg_struct *args = (struct arg_struct *)arguments. 
Powiązane problemy