> да и зачем, если можно последовательно вызвать pthread_join() столько раз, сколько нужно?
А как узнать, для чего его нужно вызывать? Хранить список всех тредов, а при завершении удалять их оттуда? Или есть более нормальный способ? (Треды создаются в результате ввода пользователем некоторой комманды)
> чем не устраивает предложенный способ с хранением списка запущенных потоков?
Тем, что из списка придется иногда удалять. Мне нужно вызывать join в конце работы программы, сразу перед освобождением всех ресурсов, которыми треды могут пользоваться. Я уже придумал другой способ: завести глобальную volatile переменную, увеличивать её при запуске треда и уменьшать при останове; в конце программы есть примерно такой код:
while (ThreadPool)
sleep (1);
Теперь возникла другая проблема: все треды находятся в deferred state, точки выхода (pthread_testcancel()) расставлены правильным образом. Но иногда выход присходит совсем в другом месте. Из man`ов я понял, что некоторые системные вызовы создают неявные точки выхода, а это происходит в тех местах, где это мне совсем не нужно. Я подавляю это путем запрета на выход (PTHREAD_CANCEL_DISABLE) и разрешения (PTHREAD_CANCEL_ENABLE) только в тех функциях, где это необходимо. Т.е. у меня есть такой код:
> Мне нужно вызывать join в конце работы программы, сразу перед освобождением всех ресурсов, которыми треды могут пользоваться.
ну и прекрасно. join-ите их по однму по мере завершения и освобождайте соотв. ресурсы.
> Я уже придумал другой способ: завести глобальную volatile переменную, увеличивать её при запуске треда и уменьшать при останове; в конце программы есть примерно такой код:
[snip]
IMHO это, мягко говоря, суровое переусложнение системы. все может быть сделано заметно проще и надежнее.