URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8589
[ Назад ]

Исходное сообщение
"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?"
Отправлено Вова , 14-Янв-10 13:11 
добавить трубу в список дескрипторов, на которых висит селект,будить через запись.

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

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


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

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

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



"cancel select / kqueue"
Отправлено jd , 15-Янв-10 03:38 
Не знаю, что такое kevent, но по идее все системные вызовы, которые "чего-то ждут" должны быть cancellation point'ами.

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


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

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


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

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