Из основного потока запускаю триаду pthread_create с PTHREAD_CREATE_DETACH
В списке процессов(ps) появились 2 записи основного и триадного потока.
Закрываю триаду pthread_exit(NULL или 0)
В списке процессов так и остались 2 записи.
Закрываю триаду exit( 0)
В списке процессов остались 2 записи.Причем триадная - зомби.
Вопрос:Как закрыть триаду , чтобы из спиcка процессов она исчезла.
Thread
Модератор: Модераторы разделов
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Thread
pthread_cancel(<child_thread>) ?
P.S. использование вами слова "триада" в данном контексте неуместно - гляньте в словаре что значит это слово.
P.S. использование вами слова "триада" в данном контексте неуместно - гляньте в словаре что значит это слово.
-
pstep
- Сообщения: 5
Re: Thread
Спасибо , что откликнулись.Мне кажется pthread_cancel немного не то,но я обязательно попробую.
pthread_cancel вызывается из иницирующего потока , чтобы закрыть инициируемый, а мне надо,
чтобы поток сам себя закрыл.При этом планировщик должен убрать запись о запущенном потоке из
таблицы процессов.Я ж вроде написал.
По поводу PS согласен с Вами,хотя встречал не только "триады" ,но и "треды" и "нити"
pthread_cancel вызывается из иницирующего потока , чтобы закрыть инициируемый, а мне надо,
чтобы поток сам себя закрыл.При этом планировщик должен убрать запись о запущенном потоке из
таблицы процессов.Я ж вроде написал.
По поводу PS согласен с Вами,хотя встречал не только "триады" ,но и "треды" и "нити"
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Thread
"тред" - это транскрипция слова thread (ну, более-менее); "нить" - это его перевод. Ваш же вариант - вообще ни то, ни то :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Thread
pstep писал(а): ↑13.02.2010 19:28Спасибо , что откликнулись.Мне кажется pthread_cancel немного не то,но я обязательно попробую.
pthread_cancel вызывается из иницирующего потока , чтобы закрыть инициируемый, а мне надо,
чтобы поток сам себя закрыл.При этом планировщик должен убрать запись о запущенном потоке из
таблицы процессов.Я ж вроде написал.
По поводу PS согласен с Вами,хотя встречал не только "триады" ,но и "треды" и "нити"
Дык вам не потоки нужны в таком случае, а процессы. Я вообще не уверен, но думаю, что основной поток (родительский процесс) нельзя остановить вызовом ptread_exit. И не ясно зачем вам что-то "скрывать" (я чего-то не понимаю?), просто остановить выполнение родительского процесса можно вызовом pthread_join(<child_tid>) для каждого работающего потока и следом совершив вызов exit();
-
pstep
- Сообщения: 5
Re: Thread
Мне кажется Вы все-таки не поняли вопрос.Наверное я сумбурно его задал.Не хотелось захламлять подробностями ,но придется.Итак: есть сервер с базой данных , сотней клиентов в терминальном режиме и отсутствием какого-либо интерфейса(даже ODBC) для пользовательских приложений.Идея: создать сервер, который
бы слушал сокет и при наличии входящего запроса создал новый процесс и отдал дальнейшее обслуживание клента
вновь созданному процессу.В идеале вроде приемлимо,однако подводные камни-в результате работы "сервер баз данных-новый процесс-клиент" могут возникнуть непредвиденые обстоятельства-заблокирована запись(транзакций нет),клиент закрыл приложение или выключил комп,отвалилась сеть....Отсюда возникает проблема контроля статуса десятка-сотни запущенных процессов.Я собственно и начал с fork, только потом мне показалосьчто через нити(специально для Портного) все это проще будет реализовать.В основном потоке создается общая для всех "тредов"управляющая структура struct str {....date_begin_thread, ...date_end_thread...} str[100].
Каждому вновь созданному потоку передается указатель только на его структуру(например для десятого
(struct*str)str[9] где запущенный поток фиксирует date_begin_thread, date_end_thread.Основной поток перебирает
str[100] через какой-то интервал и если date_end_thread -0 то pthread_cancel(thread_id) ему.Однако если созданный
(второй,двацатый,сотый....)поток корректно отработал, то соответственно он сам должен ликвидироваться.Если же после самоликвидации(pthread_exit) в таблице процессов остается запись о нем,то что будет с ней(таблицей) через пару дней?
Я не собираюсь никогда останавливать основной поток ч.з. pthread_join(<child_tid>).Его задача после accept вызвать pthread_create и прибить тот поток ,который превысил лимит по времени
PS Ребята,я не сомневаюсь ,что Вы знаете не только как пишется thread,но даже и как читается.Хватит пинать,дайте ответ на вопрос. Кроме RasenHerz(спасибо за участие) одни нравоучения.
бы слушал сокет и при наличии входящего запроса создал новый процесс и отдал дальнейшее обслуживание клента
вновь созданному процессу.В идеале вроде приемлимо,однако подводные камни-в результате работы "сервер баз данных-новый процесс-клиент" могут возникнуть непредвиденые обстоятельства-заблокирована запись(транзакций нет),клиент закрыл приложение или выключил комп,отвалилась сеть....Отсюда возникает проблема контроля статуса десятка-сотни запущенных процессов.Я собственно и начал с fork, только потом мне показалосьчто через нити(специально для Портного) все это проще будет реализовать.В основном потоке создается общая для всех "тредов"управляющая структура struct str {....date_begin_thread, ...date_end_thread...} str[100].
Каждому вновь созданному потоку передается указатель только на его структуру(например для десятого
(struct*str)str[9] где запущенный поток фиксирует date_begin_thread, date_end_thread.Основной поток перебирает
str[100] через какой-то интервал и если date_end_thread -0 то pthread_cancel(thread_id) ему.Однако если созданный
(второй,двацатый,сотый....)поток корректно отработал, то соответственно он сам должен ликвидироваться.Если же после самоликвидации(pthread_exit) в таблице процессов остается запись о нем,то что будет с ней(таблицей) через пару дней?
Я не собираюсь никогда останавливать основной поток ч.з. pthread_join(<child_tid>).Его задача после accept вызвать pthread_create и прибить тот поток ,который превысил лимит по времени
PS Ребята,я не сомневаюсь ,что Вы знаете не только как пишется thread,но даже и как читается.Хватит пинать,дайте ответ на вопрос. Кроме RasenHerz(спасибо за участие) одни нравоучения.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Thread
Начну с главного - к черту массив, создайте связный список структур для потоков вида:
И передавайте потоку указатель на его элемент списка. Собсвенно что получиться: основной поток обходит список, и если решает остановить поток то вызывает
Если же потоку надо просто закончить свою работу, то он вырезает переданную ему структуру из списка (что-то вроде struct->prev->next = struct->next; struct->next->prev = struct->prev; ), удаляет ее и завершает свою работу.
Синхронизацию и прочие мелочи вроде контроля количества потоков можете продумать сами.
Код: Выделить всё
struct ThreadData{
struct ThreadData *next;
struct ThreadData *prev;
pthread_t tid;
...
date_begin_thread;
...
date_end_thread;
}И передавайте потоку указатель на его элемент списка. Собсвенно что получиться: основной поток обходит список, и если решает остановить поток то вызывает
Код: Выделить всё
pthread_terminate(some_struct->tid);
/**
тут вырезаем элемент из списка
*/
free((void*)some_struct);Если же потоку надо просто закончить свою работу, то он вырезает переданную ему структуру из списка (что-то вроде struct->prev->next = struct->next; struct->next->prev = struct->prev; ), удаляет ее и завершает свою работу.
Синхронизацию и прочие мелочи вроде контроля количества потоков можете продумать сами.
-
pstep
- Сообщения: 5
Re: Thread
Разобрался после того как понаставлял кучу SLEEPов.
Если кому интересно - вкратце хронология:
1. запустили программу ./b
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
2. основной поток создал 2 триады pthread_create
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
534 p1 S 0:00 ./b
535 p1 S 0:00 ./b
3. обе триады самоликвидировались через pthread_exit или return
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
4. опять вызвали из основного phread_create
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
538 p1 S 0:00 ./b
539 p1 S 0:00 ./b
5. опять они закрылись.
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
Вот эту вторую запись я и принял за не закрытый поток.Каюсь,бестолковый.
Был бы признателен , если кто-то пояснит почему после thread_create в таблице 2 записи даже если там только
остается основной поток.Если интересно, приведу код- строчек 30
P.S.Спасибо за критику.
Если кому интересно - вкратце хронология:
1. запустили программу ./b
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
2. основной поток создал 2 триады pthread_create
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
534 p1 S 0:00 ./b
535 p1 S 0:00 ./b
3. обе триады самоликвидировались через pthread_exit или return
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
4. опять вызвали из основного phread_create
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
538 p1 S 0:00 ./b
539 p1 S 0:00 ./b
5. опять они закрылись.
PID TTY STAT TIME COMMAND
531 p1 S 0:00 ./b
533 p1 S 0:00 ./b
Вот эту вторую запись я и принял за не закрытый поток.Каюсь,бестолковый.
Был бы признателен , если кто-то пояснит почему после thread_create в таблице 2 записи даже если там только
остается основной поток.Если интересно, приведу код- строчек 30
P.S.Спасибо за критику.
-
pstep
- Сообщения: 5
Re: Thread
На www.linux.org.ru разъяснили
А чуял, что собака в RH 5.1 2.0.34 зарыта.
Так было давно, раньше, в 2.4.x было, что в ядре существовал syscall clone(), который позволял создовать процессы с общей памятью. Именно процессы, а не потоки. И библиотека делала видимость потоков на основании этого вызова. При этом при первом вызове pthread_create() сразу создовался ещё один процесс/поток, который управлял (эмулировал) pthread_exit и т.д.
Сейчас уже давно есть полноценные потоки, погуглите на эту тему.
А чуял, что собака в RH 5.1 2.0.34 зарыта.