LINUX.ORG.RU

pthread_create() откуда берется лишний процесс в списке процессов?


0

0

вот примитив:

#include <stdio.h>
#include <pthread.h>

void *Servlet (int *init)
{
	usleep (15000000);
	pthread_exit(NULL);
}

int main()
{
	int i=0;
	pthread_t tchild;

	if ( pthread_create ( &tchild, 0, (void*)Servlet, &i) != 0)
		perror ("Could not create thread");
	else
		pthread_detach(tchild);
	usleep (15000000);

	return 0;
}

компилирую, запускаю. даю команду ps -aux|grep моя_прога.
и вместо ожидаемых двух процессов вижу три (естественно не
считая grep моя_прога). и так сколько бы потоков я не создовал,
всегда на один поток больше чем ожидается. Кто может объяснить,
в чем тут дело ?

Артефакт Линуха.

Каждый раз, когда в проге >1 треда, создается дополнительный (один на всех)
тред-манагер, единственное назначение которого - ждать смерти дочек.

Die-Hard ★★★★★
()

Кстати-да. Die-Hard прав. Только вот почему-то в болшенстве литературы это НЕ описано. Я у себя в проекте долго глюк искал.... потом на форуме здесь прочитал что все нормально.

Dead ★★★★
()
Ответ на: комментарий от Die-Hard

понятно. тогда, если я kill'ом обью этот манагер, есть вероятность, что все остальные потоки уйдут в зомби ?

NikZ
() автор топика
Ответ на: комментарий от NikZ

NikZ (*) (2003-02-12 10:57:27.489): > если я kill'ом обью этот манагер, есть вероятность, что все остальные потоки уйдут в зомби ?

Нет. Манагер уйдет в зомби, а дочки отойдут к иниту. И информация об их статусе станет недоступной самому толстому треду.

Die-Hard ★★★★★
()

2Die-Hard "Манагер уйдет в зомби, а дочки отойдут к иниту. И информация об их статусе станет недоступной самому толстому треду"

Ты это проверял?

Просто если один трэд валится по Segmentation fault то все остальные тоже умирают. Неужели kill будет обработан по другому? Проверять как-то лень :-)

Dead ★★★★
()
Ответ на: комментарий от Dead

> Ты это проверял?
Да.

> если один трэд валится по Segmentation fault то все остальные тоже умирают.
Не совсем.

Попробуй пошли манагеру SIGSEGV. У меня вообще ничего не происходит, сигнал игнорируется!

Любой другой тред сразу вылетает, после чего вылетает все остальное.

Die-Hard ★★★★★
()

Мои наболюдения: если по Segmentation fault велетает один тред, то валются все треды сразу, не спорю. бывали случаи, когда киллом убивал один тред, часть остальных тредов убивалось, часть уходило в зомби и эти зомби приходилось добивать повторным киллом. вот это мне и интересно, что собсно на самом деле происходило. думаю, такое случается когда убиваешь или родительский трэд или "манагер" (назовем лишний трэд так)

NikZ
() автор топика
Ответ на: комментарий от NikZ

NikZ (*) (2003-02-13 13:58:14.414):
IMHO чой-то ты не то говоришь:
> часть уходило в зомби и эти зомби приходилось добивать повторным киллом.
Зомби киллом не убить, он и так мертвый.

> если по Segmentation fault велетает один тред, то валются все треды сразу
ПОЧТИ верно. "Почти" - потому что
1. Ты всегда можешь переопределить обработчик SIGSEGV, и ничего никуда вылетать
не будет;
2. "манагер" не могет сегментатион свиолейтидь - он, типа, ничего не делает.
А если ему насильно в морду SIGSEGV плеснуть, он молча обтечет и ничего не
сделает.

> ...часть остальных тредов убивалось, часть уходило в зомби...
Еще раз:
В Линухе (в нарушение POSIX'а, BTW!) есть ТРИ ПРИНЦИПИАЛЬНО РАЗЛИЧАЮЩИХСЯ типа
тредов (речь идет о pthreads).
1. Начальный толстый тред
2. "Манагер"
3. Все остальные
Все треды типа 3 являются дочками "манагера". Если грохнуть киллом любой детачнутый
тред, кроме манагера, грохнется и все остальное. Если грохнуть
манагера, он уйдет в зомби, а остальные будут жить, но - на ушах.

Die-Hard ★★★★★
()

ok наверно я не корректно выразился. вот еще один реальный пример. есть апач, который в каждый момент времени имеет примерно 20-30 процессов + 10-15 процессов - это запущенные апачем перловые скрипты. даю команду ps и вижу, что часть из этих перловых скриптов - зомби. долблю киллом по этим зомби, нифига. долблю киллом по одному из рабочих процессов апача, и все процессы апача и в том числе зомби благополучно завершают свою работу. вот примерно такая же ситуация была с моей прогой. как это комментироваь, я не знаю.

NikZ
() автор топика
Ответ на: комментарий от NikZ

2NikZ (*) (2003-02-13 16:31:58.073):
Ну, Апач (до недавнего времени) запускал пул процессов, а тредов там вообще не было.
И, потом, как Апач перл гоняет - через АПИ, или все же екзеком?


Die-Hard ★★★★★
()

2Die-Hard вот как апач гоняет перл я не знаю

NikZ
() автор топика

execом если без fastcgi

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.