вот примитив:
#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 моя_прога). и так сколько бы потоков я не создовал,
всегда на один поток больше чем ожидается. Кто может объяснить,
в чем тут дело ?
Re: pthread_create() откуда берется лишний процесс в списке процессов?
Кстати-да.
Die-Hard прав. Только вот почему-то в болшенстве литературы это НЕ описано. Я у себя в проекте долго глюк искал.... потом на форуме здесь прочитал что все нормально.
Re: pthread_create() откуда берется лишний процесс в списке процессов?
Мои наболюдения:
если по Segmentation fault велетает один тред, то валются все треды сразу, не спорю.
бывали случаи, когда киллом убивал один тред, часть остальных тредов убивалось, часть уходило в зомби и эти зомби приходилось добивать повторным киллом. вот это мне и интересно, что собсно на самом деле происходило. думаю, такое случается когда убиваешь или родительский трэд или "манагер" (назовем лишний трэд так)
Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?
NikZ (*) (2003-02-13 13:58:14.414):
IMHO чой-то ты не то говоришь:
> часть уходило в зомби и эти зомби приходилось добивать повторным киллом.
Зомби киллом не убить, он и так мертвый.
> если по Segmentation fault велетает один тред, то валются все треды сразу
ПОЧТИ верно. "Почти" - потому что
1. Ты всегда можешь переопределить обработчик SIGSEGV, и ничего никуда вылетать
не будет;
2. "манагер" не могет сегментатион свиолейтидь - он, типа, ничего не делает.
А если ему насильно в морду SIGSEGV плеснуть, он молча обтечет и ничего не
сделает.
> ...часть остальных тредов убивалось, часть уходило в зомби...
Еще раз:
В Линухе (в нарушение POSIX'а, BTW!) есть ТРИ ПРИНЦИПИАЛЬНО РАЗЛИЧАЮЩИХСЯ типа
тредов (речь идет о pthreads).
1. Начальный толстый тред
2. "Манагер"
3. Все остальные
Все треды типа 3 являются дочками "манагера". Если грохнуть киллом любой детачнутый
тред, кроме манагера, грохнется и все остальное. Если грохнуть
манагера, он уйдет в зомби, а остальные будут жить, но - на ушах.
Re: pthread_create() откуда берется лишний процесс в списке процессов?
ok наверно я не корректно выразился.
вот еще один реальный пример. есть апач, который в каждый момент времени имеет примерно 20-30 процессов + 10-15 процессов - это запущенные апачем перловые скрипты. даю команду ps и вижу, что часть из этих перловых скриптов - зомби. долблю киллом по этим зомби, нифига. долблю киллом по одному из рабочих процессов апача, и все процессы апача и в том числе зомби благополучно завершают свою работу. вот примерно такая же ситуация была с моей прогой. как это комментироваь, я не знаю.
Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?
2NikZ (*) (2003-02-13 16:31:58.073):
Ну, Апач (до недавнего времени) запускал пул процессов, а тредов там вообще не было.
И, потом, как Апач перл гоняет - через АПИ, или все же екзеком?