Приведет ли вызов select ()/pselect () во вторичном потоке привести к блокированию первичного потока?

StackOverflow https://stackoverflow.com/questions/4504377

  •  12-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

  • Вторичная нить № 1 ( select() петля предоставление услуги)

  • Вторичная нить № 2 ( select() петля предоставляет еще одну услугу)

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

Это было полезно?

Решение

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

Другие советы

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

Кроме того, см. Select_tut Manpage для некоторой помощи.

Вот соответствующий раздел от 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top