Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > потокобезопасность epoll/kqueue


Автор: kometa_75 27.8.2008, 17:02
Ув. коллеги, у кого есть информация по сабжу ? Имеется в виду, можно ли удалять события из другого потока не используя объекты синхронизации(мьютексы и т.п.) ? В одном проекте видел нечто подобное, однако инфы по safe threading вышеупомянутых интерфейсов не нашёл.

Автор: MAKCim 27.8.2008, 21:24
можно (в плане того, что безопасно), но не нужно (в плане того, что потом хрен поймешь, что происходит  smile )

Автор: nerezus 27.8.2008, 22:23
Эм, а как это относится к потокам threads, там же как бы типа select для потоков streams?

Автор: MAKCim 27.8.2008, 22:35
Цитата(nerezus @  27.8.2008,  22:23 Найти цитируемый пост)
Эм, а как это относится к потокам threads

к примеру, вызов epoll_ctl() для одного и того же дескриптора из двух потоков

Автор: nerezus 27.8.2008, 23:26
А если с ним, как с графикой, т.е. все в 1 потоке?

Автор: MAKCim 28.8.2008, 08:39
Цитата(nerezus @  27.8.2008,  23:26 Найти цитируемый пост)
А если с ним, как с графикой, т.е. все в 1 потоке? 

не понял
что как с графикой?
с кем с ним? с 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
Цитата(nerezus @ 27.8.2008,  23:26)
А если с ним, как с графикой, т.е. все в 1 потоке?

В одном потоке не получится. Вызовы epoll_wait/kevent должны иметь солидный таймаут. Желательно более одной секунды. Иначе приложение будет вываливаться. Проверено уже неоднократно. Следовательно работу с сетью надо выносить в отдельный поток. Но вызывать функции удаления сокета/события приходиться не из этого потока. Увы. Ничего другого пока не придумали.

Автор: nerezus 28.8.2008, 08:45
Цитата

с кем с ним? с epoll_ctl()?
 Ну вся работа с GUI осуществляется как правило в одном потоке.

Автор: MAKCim 28.8.2008, 08:48
Цитата(nerezus @  28.8.2008,  08:45 Найти цитируемый пост)
Ну вся работа с GUI осуществляется как правило в одном потоке.

чего то я не пойму
причем здесь GUI?
мы говорим про epoll/kqueue, дескрипторы файлов и потоки
дескриптор eventpoll можно безопасно использовать из разных потоков
это ответ на вопрос

Автор: andrew_121 2.10.2009, 01:45
Прошу прощения за пост в чужую тему.

Цитата(MAKCim @  28.8.2008,  08:45 Найти цитируемый пост)
так и есть
объект eventpoll синхронизируется ядром, т. к инкапсулирует блокировку 


К примеру, другой поток может попытаться использовать события которые были удаленны мгновением раннее в основном потоке. Как быть в этом случае?

Автор: MAKCim 2.10.2009, 15:47
Цитата(andrew_121 @  2.10.2009,  01:45 Найти цитируемый пост)
К примеру, другой поток может попытаться использовать события которые были удаленны мгновением раннее в основном потоке. Как быть в этом случае? 

это как?
объекты epoll_event, передаваемые в epoll_wait должны быть локальны для потока

Автор: andrew_121 2.10.2009, 16:21
Цитата(MAKCim @  2.10.2009,  15:47 Найти цитируемый пост)
это как?

э... Не правильно выразился.
Т.е. дескрипторы.

Автор: MAKCim 2.10.2009, 22:14
Цитата(andrew_121 @  2.10.2009,  16:21 Найти цитируемый пост)
Т.е. дескрипторы. 

что значит использовать дескрипторы в epoll_wait(), которые были удалены в основном потоке? ;)

Автор: andrew_121 2.10.2009, 23:25
Пересмотрел свое понимание. Ошибался. Сорри.
Потому и создал соседнюю тему, чтоб посмотреть на реальном примере как это дело работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)