LINUX.ORG.RU

Сколько poll можно повесить на один дескриптор?


0

0

Сколько poll можно повесить на один дескриптор и будут ли они мешать друг другу?

Исходя из возможностей poll, можно сделать эмуляцию асинхронной передачи. Вот так например: Вешаем один poll на чтение(recv не блокируется), а второй poll на запись(send не блокируется) на один и тот же сокет.

Вопрос в том, будет ли такая конструкция надежной и устойчивой???

anonymous

Заметьте, что каждый из этих poll может работать в отдельном потоке!

Надеюсь, идея понятна :)

anonymous
()

А зачем тебе это?
1) Писать в сокет можно ( по личному опыту) всегда, поку существует соединение, или не вызван shutdown(). Все ошибки записи все равно будут известны только при чтении.

2) В каждый поток ты можешь передать дескриптор poll, и каждый из них будет независимо от других потоков проверять сокет.
Поскольку poll - системный вызов, то он закрнчится раньше, чем передается управление другому процессу\потоку, если тебя это , конечно, волнует.

OxiD ★★★★
()

А зачем тебе это?
1) Писать в сокет можно ( по личному опыту) всегда, поку существует соединение, или не вызван shutdown(). Все ошибки записи все равно будут известны только при чтении.

2) В каждый поток ты можешь передать дескриптор poll, и каждый из них будет независимо от других потоков проверять сокет.
Поскольку poll - системный вызов, то он закрнчится раньше, чем передается управление другому процессу\потоку, если тебя это , конечно, волнует.

OxiD ★★★★
()

Это нужно, например, чтобы выделять на обработку очереди точно заданное время(таймер).

А что если, два потока выполняются одновременно и в каждом poll обрабатывает одинаковый дескриптор? POLLIN и POLLOUT будут перекрываться?

anonymous
()

Во первых POLLOUT будет всегда, ибо писать можно всгда, во вторых ничего страшного не произойдет, но я наверно плохо понимаю задачу.
Если я правильно понял тебе нужен общий таймер для всех нитей?
Тогда можно сохранить их идентификаторы где-нибудь, повесить обработщик для SIGALRM, и когда время придет, послать сигнал в нити, или еще-что-то типа того.

OxiD ★★★★
()

OxiD pisat' mojzhno ne vsegda, naprimer TCP socket zablokiruetsya na zapis' kogda bufer zapolnitsya.

anonymous
()

Помоему просто процесс "уснет", а когда буффер очистится, ядро вернет управление процессу. Скажите, если я не прав.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.