2009-08-29 11 views
24

Nagłówek funkcja pthread_create wygląda następująco:Dlaczego start_routine dla powrotnej pthread_create void * i wziąć void *

int pthread_create(pthread_t * thread, 
        const pthread_attr_t * attr, 
        void * (*start_routine)(void *), 
        void *arg); 

Rozumiem to wszystko oprócz tego, że wskaźnik funkcji dla start_routine ma postać void* (*fpointer) (void*) co oznacza, że przyjmuje pustego wskaźnika i zwraca nieważny wskaźnik.

Wskaźnik pustki, który należy podać, to tylko sposób przekazania argumentu do start_routine, otrzymuję tę część, ale nie rozumiem, dlaczego funkcja zwraca wskaźnik pustych wierszy? Który kod zauważy pustą wskazówkę?

Odpowiedz

27

Z dokumentacji dla pthread_create:

Gwint tworzony jest wykonanie start_routine z arg jako jedyny argument. Jeśli start_routine zwróci, efekt jest taki, jakby istniało niejawne wywołanie pthread_exit() z użyciem zwracanej wartości start_routine jako statusu wyjścia. Zauważ, że wątek, w którym pierwotnie wywołano główną(), różni się od tego. Kiedy powraca z main(), efekt jest taki, jakby istniało niejawne wywołanie exit() z użyciem zwracanej wartości main() jako statusu wyjścia.

I pthread_exit:

pthread_exit() funkcja kończy wywołującego wątku i sprawia, że ​​value_ptr dostępne dla wszystkich udany wartość przyłączenia z gwintem końcowym.

Więc jeśli zrobić pthread_join na nitce, wskaźnik wraca jest przekazywana z powrotem do wątku łączenia, co pozwala transmitować dane z gwintem umierającego na inny, żyjący wątek.

7

Z spec:

Jeżeli start_routine zwrotów, efekt jest jakby nie było niejawna wywołanie pthread_exit() użyciu wartości powrotny start_routine jak status wyjścia.