Что именно представляет собой «состояние» в pthread_join и как его запрашивать - PullRequest
2 голосов
/ 22 марта 2011

Мне интересно, что именно параметр "status" в pthread_join предназначен для

int pthread_join(pthread_t thread, void **status);

Я пытаюсь использовать это, но я не могу понять, что именно оно представляет. Согласно документации

статус

Is the location where the exit status of the joined thread is stored.

Это может быть установлено в NULL, если выход статус не требуется.

OK. Звучит неплохо. Как мне это использовать? Я посмотрел на некоторые примеры, но я не могу освоить его (и некоторые примеры совершенно неверны при его использовании). Итак, я пошел в источник. В реализации glibc я нашел следующий тест для pthread_join:

...
pthread_t mh = (pthread_t) arg;
void *result;
...
if (pthread_join (mh, &result) != 0)
{
  puts ("join failed");
  exit (1);
}

here follows the WTF moment ...

if (result != (void *) 42l)
{
  printf ("result wrong: expected %p, got %p\n", (void *) 42, result);
  exit (1);
}

Значит, значение результата (который является адресом) должно быть 42 ?? Это что-то глобальное на уровне библиотеки, потому что я не смог найти ничего конкретного в тесте ?

РЕДАКТИРОВАТЬ: кажется, этот вопрос предоставляет информацию, связанную с тем, что я спросил

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Состояние устанавливается равным значению, возвращаемому функцией, которую поток начинает выполнять (или значением, переданным pthread_exit (), если поток завершается раньше).

Пример:

 void* thread_func(void* data)
 {
     if (fail())
     {
         pthread_exit((void*)new int(2)); // pointer to int(2) returned to status
     }
     return (void*)new int(1); // pointer to int(1) returned to status;

     // Note: I am not advocating this is a good idea.
     //       Just trying to explain what happens.
 }

 pthread_create(&thread, NULL, thread_func, NULL);

 void*  status;
 pthread_join(thread, &status);
 int*   st = (int*)status;

 // Here status is a pointer to memory returned from thread_func()
 if ((*st) == 1)
 {
      // It worked.
 }
 if ((*st) == 2)
 {
      // It Failed.
 }
1 голос
/ 22 марта 2011

Прочитать документ для pthread_create.Функция, которая запускает поток, определена как возвращающая void*.Что бы это ни возвращало, pthread_join доставляет вам через void** '.Если функция решит вернуть (void *)42, тогда вы получите «42».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...