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 ожидая прихода данных >на сокет. >Тут основной поток решает что пора программе завершаться. Как разбудить поток, который >слушает сокет, чтобы поток мог корректно завершиться. Закрыть соответствующий сокет?
|