Многосвязная очередь - PullRequest
1 голос
/ 25 августа 2011

В сетевом проекте у меня есть несколько объектов, у каждого из которых есть очередь сообщений (связанный список).У каждого объекта также есть несколько клиентов, и у каждого клиента есть указатель на узел в очереди.Когда клиент получает сообщение, на которое указывает указатель, его указатель переходит к следующему сообщению в очереди.Теперь, когда все клиенты получили сообщение, я хочу, чтобы это сообщение было освобождено, чтобы оно не занимало память.Я сделал это с помощью отдельного потока, проходящего через объекты и удаляющего ненужные сообщения, действующего как ГХ, но есть ли лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Вы можете использовать подсчет ссылок, чтобы справиться с этим. Предполагая, что все указатели на элементы очереди находятся снаружи (и никогда не находятся между элементами очереди), вы можете сохранить в ячейке очереди счетчик количества указателей на нее. Каждый раз, когда вы добавляете новый указатель, вы увеличиваете этот счетчик ссылок, и всякий раз, когда часть программы выполняется с использованием ячейки, она сбрасывает счетчик ссылок, освобождая его, когда он достигает нуля. Таким образом, пока имеется выдающийся указатель на ячейку, он не будет освобожден, и как только последняя ссылка на ячейку очереди будет разорвана, она будет возвращена. Вам не нужен отдельный поток для этого.

1 голос
/ 25 августа 2011

Сообщение имеет список подписчиков.

Каждый раз, когда подписчик открывает сообщение, количество подписчиков уменьшается на единицу. Итак, у вас есть поток, ищущий сообщения с числом подписчиков = 0.

Это плохая идея.

Вы должны создать очередь удаления объектов. Каждый раз, когда подписчик открывает сообщение, он проверяет количество подписчиков. Если ноль, подписчик сообщения сам отправляет сообщение в очередь удаления. Теперь потоку GC необходимо отслеживать только очередь удаления.

Зачем вообще иметь счетчик? Список подписчиков сообщений - это связанный список токенов. Каждый подписчик связан с одним токеном в списке. Токен сообщает подписчику, что есть сообщение.

Если очередь сообщений функционирует в сети, для каждого подписчика создается токен, и токен связывается в циклический список. Для каждого токена в списке генерируется соответствующий токен для отправки абоненту. Когда абонент запрашивает получение сообщения, он отправляет свой токен аутентификации администратору очередей сообщений. Управление очередью сообщений выполняет авторизацию токена и позволяет подписчику получить доступ к сообщению, а затем отсоединяет токен от списка.

Независимо от того, является ли это сетевая очередь сообщений или локальная системная очередь, когда последний токен не связан (это круговой список - вы бы знали, что это последний токен), сообщение отправляется в очередь удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...