2014-11-26 4 views
6

В чем разница между exit() и exit_group(). Любой процесс, который имеет несколько потоков, должен использовать exit_group вместо выхода?В чем разница между exit() и exit_group()

Чтобы ответить на вопрос why do you ask - у нас есть процесс, который содержит около 40 потоков. Когда поток заблокирован, мы автоматически выходим из процесса и затем перезапускаем процесс. И мы печатаем обратную линию нити, которая была заперта. Мы хотели знать, не является ли вызов exit в этом случае отличным от exit_group.

From the docs: This system call is equivalent to exit(2) except that it terminates not only the calling thread, but all threads in the calling process's thread group - Однако в чем разница между выходом из процесса и выходом из всех потоков. Не выходит из процесса ==, выходя из всех потоков.

+1

Согласно документу (и для экспериментов с 'strace'), [exit (3)] (http://man7.org/linux/man-pages/man3/exit.3.html) использует' exit_group ' –

+0

Кстати, почему вы спрашиваете? Это фактически имеет значение только для разработчиков libc. –

+0

Вызов 'библиотеки' библиотеки C вызывает системный вызов 'exit_group'. Системный вызов 'exit' только выходит из вызывающего процесса (а процесс - это поток в ядре). –

ответ

3

Всех библиотеки нити я знаю (например, недавно glibc или musl-libc) используют низкий уровень clone(2)system call для их реализации резьбы (и некоторые библиотеки C даже используют clone чтобы fork процесс).

clone - сложный Linux syscall. Если вы не являетесь разработчиком потоковой библиотеки, вы не должны использовать его напрямую, но только через библиотечные функции (например, pthread_create(3)); смотри также futex(7) используется в pthread_mutex* функций

clone системный вызов используется для создания задач: либо темы (совместное использование адресного пространства в многопоточном процессе) или процессов.

Системный вызов exit_group связан с выходом из этих задач.

Одним словом, вы никогда не будете использовать напрямуюexit_group или clone. Ваш libc делает это за вас. Так что не волнует exit_group или _Exit; вы должны использовать только стандартную библиотечную функцию exit(3), которая имеет дело с atexit(3) & on_exit(3) зарегистрированными обработчиками и флешами <stdio.h> буферов. В редких случаях вы не хотите, чтобы это произошло, используйте _exit(2) (но вам, вероятно, это не нужно).

Конечно, если вы реализовав свой собственный libc с нуля, вы должны заботиться о exit_group & clone; но в противном случае вас это не волнует..

Если вы заботитесь о деталях реализации gory, погрузитесь в исходный код вашего libc. Подробности могут быть libc -версия, Ядро -версия и компилятор специфичны!