Вызов select () / pselect () во вторичном потоке вызовет блокировку основного потока? - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть приложение, над которым я работаю, для которого требуется пара вторичных потоков, и каждый из них будет отвечать за несколько файловых дескрипторов (не менее 1, не более 10).Дескрипторы файла не являются общими для потоков, поэтому мне не нужно беспокоиться о том, что один вторичный поток блокирует другой при просмотре select, чтобы увидеть, что готово для чтения / записи.В чем я хочу быть уверен, так это в том, что ни один из вторичных потоков не вызовет прекращения выполнения основного потока, пока выполняется вызов select / pselect.

Я бы предположил, что это не проблема- можно было бы предположить, что такие вещи будут совершаться, скажем, на веб-сервере, - но я не смог найти ничего, что конкретно говорило бы: «Да, вы можете сделать это», когда я погуглил.Я прав в своем предположении, что это не вызовет никаких проблем?

Для пояснения, что у меня выглядит примерно так:

  • Основной поток выполнения (select()цикл обработки входящих командных сообщений и исходящих ответов)

  • Вторичный поток # 1 (select() цикл, предоставляющий сервис) *

  • Вторичный поток # 2(select() цикл, предоставляющий другую услугу)

Как я упоминал ранее, ни один из файловых дескрипторов не является общим для потоков - они создаются, используются и уничтожаются в отдельном потоке,с другими нитями, неосведомленными об их существовании.

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Нет, вам не нужно беспокоиться о том, что они блокируют основной поток. Я использовал выбор в нескольких потоках в различных проектах. Пока у них есть разные FDSETS, все в порядке, и каждый из них можно использовать как независимый цикл обработки событий.

0 голосов
/ 22 декабря 2010

Разве выбор не должен блокировать весь процесс? Вы пытались установить неблокирующий режим на сокете?

Также см. Справочную страницу select_tut для получения справки.

Вот соответствующий раздел справочной страницы select_tut:

So what is the point of select()? Can't I just read and write to my descriptors whenever I want? The point of select() is that it watches multiple descriptors at the same time and properly puts the process to sleep if there is no activity.

...