Solaris thr_join против posix pthread_join

В Solaris документация thr_join гласит следующее:

int  thr_join(thread_t  thread,  thread_t  *departed,   void
     **status);
If the target thread ID is  0, thr_join() finds and  returns
     the status of a terminated undetached thread in the process.

Эквивалентен ли POSIX pthread_join?

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

приостанавливает обработку вызывающего потока до завершения целевого потока. Как я могу использовать pthread_join в случае thr_join, когда я хочу знать, какой дочерний поток завершился среди многих. Есть ли другая альтернатива? Другими словами, если родительский поток порождает N дочерних потоков, как родительский поток узнает путем опроса или чего-то еще, какой поток вышел/завершился?


person Dr. Debasish Jana    schedule 12.04.2017    source источник


Ответы (1)


Эквивалентен ли POSIX pthread_join?

Да, это эквивалентно. Ну, достаточно близко. Вы можете увидеть различия в реализации:

int
thr_join(thread_t tid, thread_t *departed, void **status)
{
    int error = _thrp_join(tid, departed, status, 1);
    return ((error == EINVAL)? ESRCH : error);
}

/*
 * pthread_join() differs from Solaris thr_join():
 * It does not return the departed thread's id
 * and hence does not have a "departed" argument.
 * It returns EINVAL if tid refers to a detached thread.
 */
#pragma weak _pthread_join = pthread_join
int
pthread_join(pthread_t tid, void **status)
{
    return ((tid == 0)? ESRCH : _thrp_join(tid, NULL, status, 1));
}

Они даже реализованы с использованием одной и той же внутренней функции.

Но вы не хотите использовать потоки Solaris. Просто используйте потоки POSIX.

person Andrew Henle    schedule 13.06.2017