2009-05-14 2 views
1

Итак, у меня есть контейнер (любой вид, возможно, std :: map или std :: vector), который содержит объекты класса с некоторой сетевой функцией, работающей в потоке, которая проверяет, все ли она подключена (поток определяется внутри этого класса и запускается при построении).Объект удаляет себя из контейнера

Можно ли каким-либо образом удалить объект из контейнера при его отключении или переместить поток за пределы объекта и использовать этот класс только для хранения данных?

ответ

1

У меня была бы очередь на выгрузку.

Когда поток замечает, что соединение не работает, он регистрирует объект (и контирант) с помощью очереди разгрузки, чтобы максимально увеличить все, чем закончилось.

Отдельный поток затем находится внутри очереди разгрузки. Его единственная цель - следить за очередью. Когда он видит новый объект в очереди, удалите его из контейнера, а затем уничтожьте его (синхронизация с потоком объектов по мере необходимости).

+0

Я действительно не понимаю, что означает очередь для выгрузки, но я использовал что-то подобное; – csiz

+0

Очередь заданий (я использую термин «разгрузка» при выгрузке объекта из контейнера). Вы просто помещаете задание в очередь (в этом случае задание - выгрузить/удалить объект из контейнера). Затем отдельный поток обрабатывает задания по одному. –

7

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

Я думаю, что я предпочитаю ваше второе решение - какой-то управляющий объект ищет после удаления мертвых объектов из коллекции. Если ничего другого, это будет довольно легко отлаживать, и логика блокировки будет централизована в одном объекте.

1

Контейнеры STL склонны считать, что они хранят значения; объекты, которые могут быть скопированы и где копии идентичны. Как правило, объекты, имеющие потоки, плохо вписываются в эту модель. У них гораздо более сильное чувство идентичности. В этом случае у вас определенно есть отступы - копия объекта в контейнере отличается от копии снаружи.

+0

"Склонен считать"? Предположим, или они не предполагают, что хранящиеся объекты являются значениями: они не люди! – akappa

+1

Контейнеры STL ТОЛЬКО хранят значения. Эти ценности могут, конечно, быть указателями. – 2009-05-14 08:12:03

0

У меня была проблема, очень похожая на вашу, которую я решил, испустив сигнал boost :: signal из «сетевой вещи», когда он обнаружил разъединение, будучи пойманным объектом, управляющим контейнером. Получив этот сигнал, он будет проходить через контейнер, удаляя из него мертвую сетевую сессию. Это может быть стоит посмотреть на него здесь:

How to make a C++ boost::signal be caught from an object which encapsulates the object which emits it?

Приветствия,

Клаудио

Смежные вопросы