The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
cancel select / kqueue, !*! from_mars, 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. А без сигналов есть способ?
Сигналы, если что, меня ничем не неустраивают :) просто интересно, есть ли еще способо.

  • pipe?, !*! Вова, 13:11 , 14-Янв-10 (1)
    добавить трубу в список дескрипторов, на которых висит селект,будить через запись.
    • pipe?, !*! from_mars, 01:51 , 15-Янв-10 (3)
      >добавить трубу в список дескрипторов, на которых висит селект,будить через запись.

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

  • cancel select / kqueue, !*! jd, 19:14 , 14-Янв-10 (2)
    Если вы используете POSIX threads, то pthread_cancel(3). Почитайте документацию по вашей системе и поэкспериментируйте: у меня в мане написано что-то мутное, что-то про неполное соответствие Linux-реализации стандарту, но по идее должно работать.
    • cancel select / kqueue, !*! from_mars, 02:38 , 15-Янв-10 (4)
      >Если вы используете POSIX threads, то pthread_cancel(3).

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


      • cancel select / kqueue, !*! jd, 03:38 , 15-Янв-10 (5)
        Не знаю, что такое kevent, но по идее все системные вызовы, которые "чего-то ждут" должны быть cancellation point'ами.
        • cancel select / kqueue, !*! from_mars, 06:04 , 16-Янв-10 (6)
          Так и есть, проверил. Если поток1 находится в ожидании на kevent и из другого потока вызвать pthread_cancel(поток1), то поток1 просыпается.

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

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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