Для упрощения, это ситуация, когда именованный канал SERVER ждет для именованного канала КЛИЕНТА писать к трубе (с помощью WriteFile())Ломать ReadFile() блокирование - именованный канал (Windows API)
В Windows API что блокирование является ReadFile()
сервер создает синхронное трубу (не внахлест I/O) с блокировкой позволило
клиент подключен, и теперь сервер ждет некоторых данных.
В обычном потоке вещей клиент отправляет некоторые данные, а сервер обрабатывает их, а затем возвращается в ReadFile(), чтобы ждать следующего фрагмента данных.
Между тем происходит событие (например, пользовательский ввод), а сервер NamedPipe SERVER должен выполнить другой код, который он не может выполнять, пока блокирует ReadFile().
На этом этапе я должен упомянуть, что клиент NamedPipe не является моим приложением, поэтому я не могу контролировать его. Я не могу заставить его отправить несколько байтов, чтобы разблокировать сервер. Он просто сидит и не посылает никаких данных. Поскольку я не контролирую реализацию Клиента, я ничего не могу изменить с этой целью.
Одним из решений было бы создать отдельный поток, в котором выполняются все операции ReadFile(). Таким образом, когда событие происходит, я могу просто обработать код. Проблема в том, что для события также требуется отдельный поток, поэтому теперь у меня есть два дополнительных потока для каждого экземпляра этого сервера. Поскольку это должно быть масштабируемым, это нежелательно.
С другой нити я попытался назвать
DisconnectNamedPipe()
и
CloseHandle()
оба они не будут возвращаться (до тех пор, пока клиент не пишет в трубу.)
Я не могу подключиться к тот же трубопровод и написать несколько байтов, потому что:
«Все экземпляры имени pipe имеет одно и то же имя канала, но каждый экземпляр имеет свои собственные буферы и дескрипторы и предоставляет отдельный канал для связи клиент/сервер ».
http://msdn.microsoft.com/en-us/library/aa365590.aspx
Мне нужен способ фальсифицировать это, так что доллар вопрос, $ 64k является:
Как я могу сломать блокировку ReadFile()?
Сколько из этих «серверных» экземпляров у тебя есть? Они говорят о до 10k ... Я знаю, что накладные расходы низкие, но идея состоит в том, чтобы минимизировать это. Я просто задаю вопрос ... это возможно? –
Я не думаю, что у вас могут быть потоки 10k :-) – alex2k8
Да, для этого потребуется пул потоков, но дело в том, что есть накладные расходы на производительность, связанные с запуском нового потока, и каждому потоку также выделяется некоторая память для его стека и т. д. Это добавляет и нежелательно. –