Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > потокобезопасность epoll/kqueue |
Автор: kometa_75 27.8.2008, 17:02 |
Ув. коллеги, у кого есть информация по сабжу ? Имеется в виду, можно ли удалять события из другого потока не используя объекты синхронизации(мьютексы и т.п.) ? В одном проекте видел нечто подобное, однако инфы по safe threading вышеупомянутых интерфейсов не нашёл. |
Автор: MAKCim 27.8.2008, 21:24 |
можно (в плане того, что безопасно), но не нужно (в плане того, что потом хрен поймешь, что происходит ![]() |
Автор: nerezus 27.8.2008, 22:23 |
Эм, а как это относится к потокам threads, там же как бы типа select для потоков streams? |
Автор: MAKCim 27.8.2008, 22:35 |
к примеру, вызов epoll_ctl() для одного и того же дескриптора из двух потоков |
Автор: nerezus 27.8.2008, 23:26 |
А если с ним, как с графикой, т.е. все в 1 потоке? |
Автор: MAKCim 28.8.2008, 08:39 |
не понял что как с графикой? с кем с ним? с epoll_ctl()? |
Автор: kometa_75 28.8.2008, 08:40 |
Спасибо за ответ. Меня он вполне удовлетворил. Немного поясню для тех кто не в курсе. В одном потоке создаётся объект-дескриптор epoll/kqueue. В нём же имеются функции на добавление/удаление сокета. Опять, здесь же происходит обращение к объекту-дескриптору на предмет каких-либо изменений в состоянии сокетов. Иначе говоря, вызывается функция epool_wait/kevent. Таймаут на этот вызов достаточно приличный. Я выбрал 5 сек. Теперь, необходимо реализовать возможность удаления сокета или события, причём моментальную. Понятное дело, что если использовать мьютексы(или что-то в этом роде) то в самом худшем случае доступ случится как раз через время таймаута(5 сек). К тому же, не совсем понятно что блокировать. Массив событий ? Объект-дескриптор ? Пытался реализовать различные методы с дополнительными массивами, примитивными уборщиками мусора и т.п. Потом глянул исходники одной сетевой либы, где на этот счёт особо не заморачиваются, а удаляют события без всяких синхронизаций. Хотя создание и работа с объектами epoll/kqueue ведутся в отдельном потоке. |
Автор: MAKCim 28.8.2008, 08:45 |
kometa_75, так и есть объект eventpoll синхронизируется ядром, т. к инкапсулирует блокировку |
Автор: kometa_75 28.8.2008, 08:45 | ||
В одном потоке не получится. Вызовы epoll_wait/kevent должны иметь солидный таймаут. Желательно более одной секунды. Иначе приложение будет вываливаться. Проверено уже неоднократно. Следовательно работу с сетью надо выносить в отдельный поток. Но вызывать функции удаления сокета/события приходиться не из этого потока. Увы. Ничего другого пока не придумали. |
Автор: nerezus 28.8.2008, 08:45 | ||
|
Автор: MAKCim 28.8.2008, 08:48 |
чего то я не пойму причем здесь GUI? мы говорим про epoll/kqueue, дескрипторы файлов и потоки дескриптор eventpoll можно безопасно использовать из разных потоков это ответ на вопрос |
Автор: MAKCim 2.10.2009, 15:47 | ||
это как? объекты epoll_event, передаваемые в epoll_wait должны быть локальны для потока |
Автор: andrew_121 2.10.2009, 16:21 |
э... Не правильно выразился. Т.е. дескрипторы. |
Автор: MAKCim 2.10.2009, 22:14 |
что значит использовать дескрипторы в epoll_wait(), которые были удалены в основном потоке? ;) |
Автор: andrew_121 2.10.2009, 23:25 |
Пересмотрел свое понимание. Ошибался. Сорри. Потому и создал соседнюю тему, чтоб посмотреть на реальном примере как это дело работает. |