The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"cancel select / kqueue"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"cancel select / kqueue"  +/
Сообщение от from_mars on 14-Янв-10, 08:28 
Есть НЕосновной поток, который спит на select / kevent ожидая прихода данных на сокет.
Тут основной поток решает что пора программе завершаться. Как разбудить поток, который слушает сокет, чтобы поток мог корректно завершиться.

В венде делаю так:

thread () {
  .....
  while (1) {
    dw_res = WaitForMultipleObjects([socket, shutdown_event],....);
    if (0 == dw_res) { // сообщение от сокета
      // смотрим что там пришло
    }
    else if (1 == dw_res) { // сработало событие завершения
      // удаляем выделенное
      // закрываем открытое
      break;
    }
  }
  .....
}

main () {
  ....
  // стартуем поток thread()
  .....
  .....
  SetEvent(shutdown_event); // сигналим потоку(ам) чтобы просыпались и завершались
  // ждем завершения потока
  // выходим
}

Знаю что можно с помощью сигналов с kqueue. А без сигналов есть способ?
Сигналы, если что, меня ничем не неустраивают :) просто интересно, есть ли еще способо.

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

  • pipe?, Вова, 13:11 , 14-Янв-10, (1)  
    • pipe?, from_mars, 01:51 , 15-Янв-10, (3)  
  • cancel select / kqueue, jd, 19:14 , 14-Янв-10, (2)  
  • cancel select / kqueue, Michelnok, 23:28 , 31-Янв-10, (8)  

Сообщения по теме [Сортировка по времени | RSS]


1. "pipe?"  +/
Сообщение от Вова on 14-Янв-10, 13:11 
добавить трубу в список дескрипторов, на которых висит селект,будить через запись.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "pipe?"  +/
Сообщение от from_mars on 15-Янв-10, 01:51 
>добавить трубу в список дескрипторов, на которых висит селект,будить через запись.

Кстати вариант. :)
Спасибо.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "cancel select / kqueue"  +/
Сообщение от jd (??) on 14-Янв-10, 19:14 
Если вы используете POSIX threads, то pthread_cancel(3). Почитайте документацию по вашей системе и поэкспериментируйте: у меня в мане написано что-то мутное, что-то про неполное соответствие Linux-реализации стандарту, но по идее должно работать.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "cancel select / kqueue"  +/
Сообщение от from_mars on 15-Янв-10, 02:38 
>Если вы используете POSIX threads, то pthread_cancel(3).

Спасибо. Почитал.
Интересно kevent является cancellation point-ом во FreeBSD? В мане среди select, poll и прочего, kevent нет.  Надо проверить.


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "cancel select / kqueue"  +/
Сообщение от jd (??) on 15-Янв-10, 03:38 
Не знаю, что такое kevent, но по идее все системные вызовы, которые "чего-то ждут" должны быть cancellation point'ами.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "cancel select / kqueue"  +/
Сообщение от from_mars on 16-Янв-10, 06:04 
Так и есть, проверил. Если поток1 находится в ожидании на kevent и из другого потока вызвать pthread_cancel(поток1), то поток1 просыпается.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "cancel select / kqueue"  +/
Сообщение от BigHO on 30-Янв-10, 16:37 
>Так и есть, проверил. Если поток1 находится в ожидании на kevent и
>из другого потока вызвать pthread_cancel(поток1), то поток1 просыпается.

и тут же умирает... вот такая селяви. Вообще первый вариант (с pipe или socketpair) по сравнению с pthread_cancel будет +100. pthread_cancel вообще лучше не использовать, если core dump не хочется.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "cancel select / kqueue"  +/
Сообщение от Michelnok (ok) on 31-Янв-10, 23:28 
>Есть НЕосновной поток, который спит на select / kevent ожидая прихода данных
>на сокет.
>Тут основной поток решает что пора программе завершаться. Как разбудить поток, который
>слушает сокет, чтобы поток мог корректно завершиться.

Закрыть соответствующий сокет?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру