Структура данных для отслеживания активных соединений - PullRequest
0 голосов
/ 09 ноября 2010

Когда я хочу отслеживать активные соединения, лучше ли сохранять их в связанном списке или непосредственно в каком-либо массиве, где индекс будет представлять идентификатор соединения?Я хочу предотвратить возможные проблемы состояния гонки, например:

  • количество соединений в списке большое
  • кто-то начинает искать соединение, которое находится в конце списка
  • между тем во время поиска соединение обрывается

1 Ответ

0 голосов
/ 09 ноября 2010

Структура должна иметь дескриптор соединения (SOCKET), счетчик ссылок и флаг, обозначающий, что соединение должно быть закрыто, а объект удален как можно скорее.Каким бы ни был контейнер, он должен иметь механизм синхронизации (критический раздел) для поиска / вставки / удаления и логику GetReference / Release.Функция GetReference должна возвращать NULL, если установлен флаг закрытия.Вам может потребоваться более одного GetReference, в зависимости от условий поиска (а объект соединения должен иметь все те значения, которые могут помочь его обнаружению в контейнере).Одна из функций GetReference может создавать новый объект, если он не существует в контейнере.

Функция освобождения должна закрывать соединение и удалять объект из контейнера, если установлен флаг закрытия и счетчик ссылок сброшен до нуля.Однако версия не должна закрывать соединение в критической секции, потому что это может занять много времени (зависит от постепенного отключения и длительной опции ).Release должен ввести CS, уменьшить количество ссылок, если он равен нулю, затем выйти из CS, закрыть соединение, снова ввести CS, удалить объект из контейнера и удалить его.Поскольку флаг закрытия поднимается, счетчик ссылок не будет повышаться между двумя CS.

...