Будет ли pthread_join остановить родительскую программу, если дочерний поток все еще работает? .. pthread_detach сделает это быстрее?вместо использования соединения? - PullRequest
1 голос
/ 30 сентября 2011

Моя программа выглядит примерно так ... Я хотел знать, замедлюсь ли я, если я вызову pthread join ???

void* a(void *a)
{
 do---something();//which is a very long procedure, I mean takes a lot of time...
 pthread_exit();
}

main()
{
 while(1)
 {
  pthread_create(a);
  pthread_join(a);
 }
}

Итак, если я вызову pthread_join, остановлюсь ли я в этой точке, пока дочерний поток не завершит выполнение, или я продолжу и создаю еще один поток ?????

Ответы [ 4 ]

2 голосов
/ 30 сентября 2011

С спецификации POSIX :

Функция pthread_join () должна приостанавливать выполнение вызывающего потока до тех пор, пока целевой поток не завершится, если целевой поток уже не завершился.

Если это не то, что вам нужно, либо отложите вызов pthread_join (поместив все pthread_t в контейнер, чтобы вы могли присоединиться к ним позже), либо используйте pthread_detach не нужно присоединяться к ним вообще.

1 голос
/ 02 октября 2011

pthread_join () блокируется до тех пор, пока дочерний поток не завершится, но вы все равно хотите / должны вызывать его, чтобы правильно очистить дочерний поток после его удаления. Но, как вы говорите, вы не хотите, чтобы ваш основной поток был заблокирован, так как с этим бороться? Я бы сделал так, чтобы дочерний поток отправлял сообщение (через пару сокетов или другим механизмом) обратно в свой родительский поток непосредственно перед тем, как он выйдет .... когда родительский поток получает это сообщение, то он знает, что сейчас подходящее время для вызова pthread_join (), поскольку дочерний поток уже пропал (или почти пропал) и, следовательно, pthread_join никогда не будет блокироваться (или, по крайней мере, не более нескольких миллисекунд).

1 голос
/ 30 сентября 2011

Возможно, вы захотите использовать неблокирующие сокеты для обработки множества клиентов без необходимости создания потока для каждого.См. Часто цитируемые Проблема C10K для получения более подробной информации.

1 голос
/ 30 сентября 2011

блоки вызова соединения, пока поток не выйдет

...