2010-09-21 2 views
49

Я использую библиотеку PTHREAD для создания & соединительных нитей в С.Самостоятельные против объединяемого POSIX Threads

  1. Когда я должен создать нить как обособленные, с самого начала? Предоставляет ли он какое-либо преимущество в производительности по сравнению с объединенной нитью?

  2. Является ли законным не делать pthread_join() в потоке присоединения (по умолчанию)? Или должна ли такая нить всегда использовать функцию detach() перед pthread_exit() ing?

ответ

67
  1. Создать отдельностоящий нить, когда вы знаете, что вы не хотите ждать его с pthread_join(). Единственное преимущество в производительности заключается в том, что когда прекращенный поток завершается, его ресурсы могут быть немедленно освобождены, а не ждать, пока поток будет соединен до того, как ресурсы будут освобождены.

  2. Это «законный», чтобы не присоединяться к нитке; но обычно это не рекомендуется, потому что (как было отмечено ранее) ресурсы не будут выпущены до тех пор, пока поток не будет присоединен, поэтому они будут оставаться на неопределенное время (пока программа не выйдет), если вы не присоединитесь к ней.

+0

сомнение: в случае отдельных потоков, что, если основной поток заканчивает выполнение до того, как отсоединенная нить завершена? Я думаю, что это прекратит процесс, убивающий все потоки. Итак, в каких сценариях используются отдельные потоки, потому что я должен быть уверен, что выделенный поток завершил выполнение? – Ajax

+0

@Ajax: Эмпирически, если основной поток заканчивается, программа выходит и потоки ... завершаются. Это, по крайней мере, похоже на поведение в Mac OS X (10.10.1 Yosemite). Я не могу найти ничего в документации POSIX, которая указывает, что другие потоки продолжаются, если вызывается 'exit()' или '_exit()' или '_Exit()'. Если основной поток выполняет 'pthread_exit()', то другие потоки получают шанс завершить. –

+0

С другой стороны: съемные нити хороши, когда у вас уже есть другой механизм опроса; вы можете использовать тот же механизм опроса, чтобы проверить состояние результата, и поэтому знать, завершен ли поток. Это случай: «Готово? Если да, используйте его». –

Смежные вопросы