Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как убить поток, послав ему сигнал?


Автор: Dimonius 2.3.2007, 00:49
У меня есть программа сервер, которая при  подключении клиента выделяет для каждого отдельный поток. И получается, что работа с каждым клиентом крутится в своем потоке. Надо прикрутить к этому обязательно сигналы. Есть идеи?

Я хотел бы отключать клиента после некоторого времени бездействия. Например, если клиент ничего не делает (не присылает) в течение 10 минут, то сервер бы его отключал. Причем отключал корректно (закрыв соединение и убив поток, который обслуживает клиента). Есть мысля генерировать, какой-нибудь сигнал и отправлять его в поток, чтобы тот завершился. Но как это сделать???, не могу придумать.  smile 

Еще работу с таймера надо наладить. Так как я не могу пользоваться alarm() и settimer() так как они пользуются одним и тем же таймером. Я имею ввиду, если один поток изменит значение таймера, то и для других потоков оно тоже изменится... а нужно, чтобы каждый поток имел свой таймер, по истечению которого поток бы закрывался.

Ребята помогите, срочно нужно решение этой проблемы!

Автор: MAKCim 2.3.2007, 16:42
Цитата(Dimonius @  2.3.2007,  00:49 Найти цитируемый пост)
Ребята помогите, срочно нужно решение этой проблемы! 

1. Не использовать потоки (использовать процессы)
2. pthread_cancel() + pthread_setcancelstate()/pthread_setcanceltype()

Автор: Dimonius 7.3.2007, 00:54
Цитата(MAKCim @  2.3.2007,  16:42 Найти цитируемый пост)
1. Не использовать потоки (использовать процессы)

В линукс потоки работают как процессы. http://www.natahaus.ru/2006/02/19/programmirovanie_dlja_Linux.html

А так, разобрался как работают сигналы. Вопрос решен.

Автор: MAKCim 7.3.2007, 09:56
Цитата(Dimonius @  7.3.2007,  00:54 Найти цитируемый пост)
В линукс потоки работают как процессы

есть posixthreads и linuxthreads

Автор: Ken 1.4.2007, 00:20
Цитата(Dimonius @ 2.3.2007,  00:49)
У меня есть программа сервер, которая при  подключении клиента выделяет для каждого отдельный поток. И получается, что работа с каждым клиентом крутится в своем потоке. Надо прикрутить к этому обязательно сигналы. Есть идеи?

Я хотел бы отключать клиента после некоторого времени бездействия. Например, если клиент ничего не делает (не присылает) в течение 10 минут, то сервер бы его отключал. Причем отключал корректно (закрыв соединение и убив поток, который обслуживает клиента). Есть мысля генерировать, какой-нибудь сигнал и отправлять его в поток, чтобы тот завершился. Но как это сделать???, не могу придумать.  smile 

Еще работу с таймера надо наладить. Так как я не могу пользоваться alarm() и settimer() так как они пользуются одним и тем же таймером. Я имею ввиду, если один поток изменит значение таймера, то и для других потоков оно тоже изменится... а нужно, чтобы каждый поток имел свой таймер, по истечению которого поток бы закрывался.

Ребята помогите, срочно нужно решение этой проблемы!

Если клиентские потоки не используют какие-нибудь общие данные в памяти, то лучше использовать процессы. Если один из потоков завершит работу аварийно (например, Segmentation fault), то завершится процесс с всеми другими потоками. В случае отдельных процессов все процессы работают изолированно и не влияют друг-другу и проблема с таймером тоже решится.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)