Я использую порты завершения ввода-вывода в Windows, у меня есть объект под названием «Stream», который напоминает и абстрагирует РУЧКУ (так что это может быть сокет, файл и т. Д.).
Когда я вызываю Stream :: read () или Stream :: write () (так, ReadFile () / WriteFile () в случае файлов и WSARecv () / WSASend () в случае сокетов), я выделяю новая структура OVERLAPPED, чтобы сделать ожидающий запрос ввода-вывода, который будет завершен в цикле IOCP каким-либо другим потоком.
Затем, когда структура OVERLAPPED будет завершена циклом IOCP, она будет там уничтожена. Если это так, Stream :: read () или Stream :: write () вызываются снова из цикла IOCP, они будут создавать экземпляры новых структур OVERLAPPED, и это будет длиться вечно.
Это прекрасно работает. Но теперь я хочу улучшить это, добавив кеширование объектов OVERLAPPED: когда мой объект Stream выполняет много операций чтения или записи, абсолютно имеет смысл кэшировать структуры OVERLAPPED.
Но теперь возникает проблема: когда я освобождаю объект Stream, я должен освободить кешированные структуры OVERLAPPED, но как я могу узнать, завершены ли они или все еще ожидают, и один из циклов IOCP завершит это в последнее время? Итак, здесь требуется атомарный счетчик ссылок, но теперь проблема в том, что если я использую счетчик атомарных ссылок, мне придется увеличивать этот счетчик ссылок для каждой операции чтения или записи и уменьшать для каждого IOCP. завершение цикла структуры OVERLAPPED или удаление потока, которые на сервере представляют собой много операций, поэтому я закончу увеличением / уменьшением большого количества атомарных счетчиков < em> много раз.
Будет ли это очень негативно влиять на параллелизм нескольких потоков? Это моя единственная забота, которая не дает мне установить этот атомарный счетчик ссылок для каждой структуры OVERLAPPED.
Беспочвенны ли мои опасения?
Я подумал, что это важная тема, на которую стоит обратить внимание, и вопрос о SO, чтобы увидеть мысли других людей по этому поводу и методы кэширования OVERLAPPED структур с помощью IOCP, того стоит. Я хочу найти умное решение по этому поводу, без использования атомарных счетчиков ссылок, если это возможно.