Есть НЕосновной поток, который спит на 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. А без сигналов есть способ?
Сигналы, если что, меня ничем не неустраивают :) просто интересно, есть ли еще способо.
добавить трубу в список дескрипторов, на которых висит селект,будить через запись.
>добавить трубу в список дескрипторов, на которых висит селект,будить через запись.Кстати вариант. :)
Спасибо.
Если вы используете POSIX threads, то pthread_cancel(3). Почитайте документацию по вашей системе и поэкспериментируйте: у меня в мане написано что-то мутное, что-то про неполное соответствие Linux-реализации стандарту, но по идее должно работать.
>Если вы используете POSIX threads, то pthread_cancel(3).Спасибо. Почитал.
Интересно kevent является cancellation point-ом во FreeBSD? В мане среди select, poll и прочего, kevent нет. Надо проверить.
Не знаю, что такое kevent, но по идее все системные вызовы, которые "чего-то ждут" должны быть cancellation point'ами.
Так и есть, проверил. Если поток1 находится в ожидании на kevent и из другого потока вызвать pthread_cancel(поток1), то поток1 просыпается.
>Так и есть, проверил. Если поток1 находится в ожидании на kevent и
>из другого потока вызвать pthread_cancel(поток1), то поток1 просыпается.и тут же умирает... вот такая селяви. Вообще первый вариант (с pipe или socketpair) по сравнению с pthread_cancel будет +100. pthread_cancel вообще лучше не использовать, если core dump не хочется.
>Есть НЕосновной поток, который спит на select / kevent ожидая прихода данных
>на сокет.
>Тут основной поток решает что пора программе завершаться. Как разбудить поток, который
>слушает сокет, чтобы поток мог корректно завершиться.Закрыть соответствующий сокет?