Экземпляры именованных каналов
Самый простой сервер канала создает один экземпляр канала, подключается к одному клиенту, взаимодействует с клиентом, отключается от клиента, закрывает дескриптор канала и завершает работу. Тем не менее, чаще всего сервер канала взаимодействует с несколькими клиентами канала. Сервер канала может использовать один экземпляр канала для подключения к нескольким клиентам каналов, подключаясь к каждому клиенту и отключая их от каждого клиента в последовательности, но производительность будет плохой. Сервер канала должен создать несколько экземпляров канала, чтобы эффективно обрабатывать несколько клиентов одновременно.
Существует три основных стратегии обслуживания нескольких экземпляров канала.
- Создайте отдельный поток для каждого экземпляра канала. Пример многопоточного сервера канала см. в разделе многопоточный сервер канала.
- Используйте перекрывающиеся операции, указав структуруOVERLAPPED в ReadFile, WriteFileи функции ConnectNamedPipe. Пример см. в разделе Именованный сервер канала с использованием перекрывающихся операций ввода-вывода.
- Используйте перекрывающиеся операции с помощью функций ReadFileEx и WriteFileEx, которые указывают подпрограмму завершения, выполняемую при завершении операции. Пример см. в разделе Именованный сервер конвейера с помощью подпрограмм завершения.
Многопоточный сервер канала проще всего записывать, так как поток для каждого экземпляра обрабатывает обмен данными для одного клиента канала. Система выделяет время процессора каждому потоку по мере необходимости. Но каждый поток использует системные ресурсы, что является недостатком для сервера канала, обрабатывающего большое количество клиентов.
С помощью однопоточного сервера проще координировать операции, влияющие на несколько клиентов, и проще защитить общие ресурсы от одновременного доступа нескольких клиентов. Задача однопоточного сервера заключается в том, что для обработки одновременных потребностей клиентов требуется координация перекрывающихся операций.