Почему start_routine для pthread_create возвращает void * и принимает void * - PullRequest
25 голосов
/ 30 августа 2009

Заголовок функции для pthread_create выглядит следующим образом:

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

Я все понимаю, за исключением того, что указатель функции для start_routine имеет форму void* (*fpointer) (void*), что означает, что он принимает пустой указатель и возвращает пустой указатель .

Указатель void, который он принимает, является просто способом передачи аргумента в start_routine, я получаю эту часть, но я не понимаю, почему функция возвращает указатель void? Какой код даже заметит этот пустой указатель?

Ответы [ 2 ]

28 голосов
/ 30 августа 2009

Из документации для pthread_create :

Поток создается, выполняя start_routine с аргументом arg в качестве единственного аргумента. Если start_routine возвращается, эффект такой, как если бы был неявный вызов pthread_exit () с использованием возвращаемого значения start_routine в качестве состояния выхода. Обратите внимание, что поток, в котором main () был первоначально вызван, отличается от этого. Когда он возвращается из main (), эффект такой, как если бы был неявный вызов exit () с использованием возвращаемого значения main () в качестве состояния выхода.

И pthread_exit :

Функция pthread_exit () завершает вызывающий поток и делает значение value_ptr доступным для любого успешного соединения с завершающим потоком.

Таким образом, если вы выполняете pthread_join для потока, возвращаемый им указатель передается обратно в присоединяющийся поток, что позволяет вам передавать информацию из умирающего потока в другой, живой поток.

7 голосов
/ 30 августа 2009

Из спецификации :

Если start_routine возвращается, эффект, как если бы был неявный позвоните на pthread_exit() используя возвращаемое значение start_routine как статус выхода.

...