IOCP в пользовательском пуле потоков

В настоящее время я ищу в Интернете реализацию пользовательского пула потоков. Я нашел реализацию, которая использует IOCP. Мне интересно, какая польза от их использования? Предусматривают ли они кражу работы или что-то в этом роде, я действительно мог бы найти ответ...


person Martin Moser    schedule 17.12.2008    source источник
comment
Может быть, вы могли бы добавить ссылку на найденную вами реализацию пользовательского пула потоков?   -  person Milan Gardian    schedule 13.01.2009


Ответы (2)


IOCP = «Порт завершения ввода-вывода». Это объект ядра, встроенный в ОС Windows, который предоставляет вам интеллектуальный способ управления многопоточным асинхронным вводом-выводом.

В очень упрощенных (и немного упрощенных) терминах вы сообщаете IOCP о задачах ввода-вывода, которые вы хотите выполнить. Он будет выполнять их асинхронно и поддерживать очередь результатов каждого из этих заданий. Ваш вызов, чтобы сообщить IOCP о задании, немедленно возвращается (он не блокируется, пока происходит ввод-вывод). Вам возвращается объект, который концептуально похож на .NET IAsyncResult... он позволяет вам блокировать, если вы решите, или вы можете предоставить обратный вызов, или вы можете периодически опрашивать, чтобы увидеть, завершено ли задание.

При выполнении этих заданий IOCP использует пул потоков. Пул потоков пытается ограничить количество потоков количеством процессоров или меньше (это настраивается, но намерение и значение по умолчанию — ограничить количество процессоров). Однако IOCP предусматривает тот факт, что иногда задачи в этих потоках могут блокироваться. Задачи Asycn IO не будут блокироваться, но вы, возможно, предоставили ему какую-то другую задачу. Итак, вы можете дать IOCP другое число... это количество потоков выше «обычного максимума», до которого IOCP разрешено подниматься из-за блокировки одного из других потоков. Цель состоит в том, чтобы иметь до «обычного максимума» потоков, которые действительно что-то делают (т. е. не блокируются). Если это произойдет, то какое-то время IOCP будет использовать больше потоков, чем обычный максимум, но он откажется создавать какие-либо новые потоки, пока не вернется к «обычному максимуму».

Это краткое изложение, чисто концептуальное и, как я уже сказал, в некоторых отношениях чрезмерно упрощенное. Но это должно дать вам общее представление. Об этом подробно рассказывается в книгах Джеффри Рихтера по ОС Windows (но эти книги уже не издаются). Вы можете найти эти книги бывшими в употреблении, и на самом деле они стоят дороже, чем изначально. Я думаю, что «Advanced Windows» — это название, которое вам нужно, но, возможно, существует обновленная версия книги с другим названием.

person Charlie Flowers    schedule 25.03.2009
comment
Чарли, книга Рихтера была переиздана и переименована, теперь она известна как Windows Via C/C++. - person Len Holgate; 13.01.2011

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

person TakeMeAsAGuest    schedule 25.01.2019
comment
Вы уверены насчет 100 мс? Кажется, что много времени - почему бы не сделать мгновенный релиз, особенно если количество разблокированных потоков не так велико по сравнению с максимальным количеством разрешенных. - person Dmitry Sychov; 08.01.2020