Создает ли IOCP свои собственные потоки?

Я изучаю IOCP, и в соответствии с этим статья:

Чтобы начать использовать порты завершения, нам нужно создать порт завершения, который, в свою очередь, создает ряд параллельных потоков (потоков, которые существуют с портом завершения — не путать с рабочими потоками), которые вы укажете.

Я думал, что единственные существующие потоки — это те, которые я создаю для исключения из очереди пакетов завершения из порта завершения. Что это за «одновременные потоки», которые создает порт завершения?


person Community    schedule 21.02.2015    source источник


Ответы (2)


Автор, похоже, не до конца понимает порты завершения. В дополнение к заявлению, которое вы процитировали, в этой статье есть диаграмма, снова содержащая фразу «параллельные потоки». Такого нет. Настройка количества потоков порта завершения — это количество потоков, которым будет разрешено выполняться одновременно.

В статье есть и другие странности. Он создает сокет только для вызова CreateIoCompletionPort. Сразу после того, как он уничтожит розетку. Автор, кажется, верит в несколько магических заклинаний, которые он видел в других местах в сети. Не воспринимайте эту статью слишком буквально. Прочтите документацию по API.

person usr    schedule 21.02.2015

IOCP не создает свои собственные потоки. Операции IOCP выполняются в бэкгруппе, а затем отправляют результат в очередь завершения IOCP. Параметр NumberOfConcurrentThreads параметра CreateIoCompletionPort() просто определяет, сколько рабочих потоков могут одновременно обрабатывать пакеты завершения. Это объясняется в документации MSDN.

Порты завершения ввода-вывода

Хотя любое количество потоков может вызывать GetQueuedCompletionStatus для указанного порта завершения ввода-вывода, когда указанный поток вызывает GetQueuedCompletionStatus в первый раз, он связывается с указанным портом завершения ввода-вывода до тех пор, пока не произойдет одно из трех событий: другой порт завершения ввода-вывода или закрывает порт завершения ввода-вывода. Другими словами, один поток может быть связан не более чем с одним портом завершения ввода-вывода.

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

...

Наиболее важным свойством порта завершения ввода-вывода, которое следует тщательно учитывать, является значение параллелизма. Значение параллелизма порта завершения указывается при его создании с помощью CreateIoCompletionPort с помощью параметра NumberOfConcurrentThreads. Это значение ограничивает количество выполняемых потоков, связанных с портом завершения. Когда общее количество доступных для выполнения потоков, связанных с портом завершения, достигает значения параллелизма, система блокирует выполнение любых последующих потоков, связанных с этим портом завершения, до тех пор, пока количество доступных для выполнения потоков не упадет ниже значения параллелизма.

person Remy Lebeau    schedule 21.02.2015