pthreads - присоединиться к группе потоков, дождаться выхода - PullRequest
4 голосов
/ 02 января 2011

В интерфейсе потока POSIX pthread_join(thread) может использоваться для блокировки до выхода из указанного потока.

Существует ли подобная функция, которая позволит блокировать выполнение до выхода из любого дочернего потока?

Это будет похоже на системный вызов wait() UNIX, за исключением того, что применимо для дочерних потоков, а не процессов

Ответы [ 3 ]

7 голосов
/ 02 января 2011

Я не думаю, что это напрямую возможно из pthreads как такового, но вы можете обойти это довольно легко.

Используя API pthreads, вы можете использовать pthread_cond_wait и друзей для настройки "условие "и ждать на нем.Когда поток собирается завершить работу, сигнализируйте условие для пробуждения ожидающего потока.

В качестве альтернативы, другой метод заключается в создании канала с pipe, а когда поток собирается выйти, write длятруба.Пусть основная нить ожидает на другом конце трубы либо с select, poll, epoll, либо с вашим любимым вариантом.(Это также позволяет вам одновременно ожидать на других FD.)

Более новые версии Linux также включают в себя «eventfds» для того же, см. man eventfd, но обратите внимание, что это добавлено только недавно.Обратите внимание, что это не POSIX, а только для Linux, и он доступен только в том случае, если вы достаточно современны.(2.6.22 или лучше.)

Мне лично всегда было интересно, почему этот API не был разработан для обработки этих вещей подобно дескрипторам файлов.Если бы это был я, они были бы "четными таблицами", и вы могли бы select файлы, темы, таймеры ...

2 голосов
/ 02 января 2011

Я не думаю, что в интерфейсе потока POSIX есть какая-либо функция для этого.

Вам нужно создать свою собственную версию - например, массив флагов (по одному флагу на поток), защищенныхмьютексом и условной переменной;где непосредственно перед "pthread_exit ()" каждый поток получает мьютекс, устанавливает свой флаг и затем выполняет "pthread_cond_signal ()".Основной поток ожидает сигнала, а затем проверяет массив флагов, чтобы определить, к какому потоку / потокам присоединиться (к тому времени может быть более одного потока для присоединения).

0 голосов
/ 02 января 2011

Вам необходимо реализовать условную переменную по одному из pthread: pthread_cond_wait (), pthread_cond_signal () / pthread_cond_broadcast ().

...