Thread

Модератор: Модераторы разделов

pstep
Сообщения: 5

Thread

Сообщение pstep »

Из основного потока запускаю триаду pthread_create с PTHREAD_CREATE_DETACH
В списке процессов(ps) появились 2 записи основного и триадного потока.
Закрываю триаду pthread_exit(NULL или 0)
В списке процессов так и остались 2 записи.
Закрываю триаду exit( 0)
В списке процессов остались 2 записи.Причем триадная - зомби.
Вопрос:Как закрыть триаду , чтобы из спиcка процессов она исчезла.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Thread

Сообщение RasenHerz »

pthread_cancel(<child_thread>) ?

P.S. использование вами слова "триада" в данном контексте неуместно - гляньте в словаре что значит это слово.
Спасибо сказали:
pstep
Сообщения: 5

Re: Thread

Сообщение pstep »

Спасибо , что откликнулись.Мне кажется pthread_cancel немного не то,но я обязательно попробую.
pthread_cancel вызывается из иницирующего потока , чтобы закрыть инициируемый, а мне надо,
чтобы поток сам себя закрыл.При этом планировщик должен убрать запись о запущенном потоке из
таблицы процессов.Я ж вроде написал.
По поводу PS согласен с Вами,хотя встречал не только "триады" ,но и "треды" и "нити"
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Thread

Сообщение Portnov »

"тред" - это транскрипция слова thread (ну, более-менее); "нить" - это его перевод. Ваш же вариант - вообще ни то, ни то :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Thread

Сообщение RasenHerz »

pstep писал(а):
13.02.2010 19:28
Спасибо , что откликнулись.Мне кажется pthread_cancel немного не то,но я обязательно попробую.
pthread_cancel вызывается из иницирующего потока , чтобы закрыть инициируемый, а мне надо,
чтобы поток сам себя закрыл.При этом планировщик должен убрать запись о запущенном потоке из
таблицы процессов.Я ж вроде написал.
По поводу PS согласен с Вами,хотя встречал не только "триады" ,но и "треды" и "нити"

Дык вам не потоки нужны в таком случае, а процессы. Я вообще не уверен, но думаю, что основной поток (родительский процесс) нельзя остановить вызовом ptread_exit. И не ясно зачем вам что-то "скрывать" (я чего-то не понимаю?), просто остановить выполнение родительского процесса можно вызовом pthread_join(<child_tid>) для каждого работающего потока и следом совершив вызов exit();
Спасибо сказали:
pstep
Сообщения: 5

Re: Thread

Сообщение pstep »

Мне кажется Вы все-таки не поняли вопрос.Наверное я сумбурно его задал.Не хотелось захламлять подробностями ,но придется.Итак: есть сервер с базой данных , сотней клиентов в терминальном режиме и отсутствием какого-либо интерфейса(даже 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(спасибо за участие) одни нравоучения.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Thread

Сообщение RasenHerz »

Начну с главного - к черту массив, создайте связный список структур для потоков вида:

Код: Выделить всё

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

Сообщение pstep »

Разобрался после того как понаставлял кучу 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.Спасибо за критику.
Спасибо сказали:
pstep
Сообщения: 5

Re: Thread

Сообщение pstep »

На www.linux.org.ru разъяснили
Так было давно, раньше, в 2.4.x было, что в ядре существовал syscall clone(), который позволял создовать процессы с общей памятью. Именно процессы, а не потоки. И библиотека делала видимость потоков на основании этого вызова. При этом при первом вызове pthread_create() сразу создовался ещё один процесс/поток, который управлял (эмулировал) pthread_exit и т.д.

Сейчас уже давно есть полноценные потоки, погуглите на эту тему.

А чуял, что собака в RH 5.1 2.0.34 зарыта.
Спасибо сказали: