В чем разница между exit() и exit group()

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

ответ на вопрос why do you ask - У нас есть процесс, который имеет около сорока нитей. Когда поток заблокирован, мы автоматически выходим из процесса, а затем перезапускаем процесс. И мы печатаем обратную дорожку нити, которая была заперта. Мы хотели знать, является ли вызов 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 - однако, в чем разница между выходом из процесса и выходом из всех потоков. Не выходит из process == выход из всех потоков.

1 ответов


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

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

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

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

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

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

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