![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Vadimik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
Имеется блокируемая очередь сообщений и обрабатывающие потоки для этой очереди (раньше был один такой поток, но захотелось больше 1). Каждое сообщение имеет свой объект User (сервер игровой - User содержит различные игровые переменные) и пришедший от него пакет данных, с кототорыми и работают потоко. При этом потоки могут при необходимости запрашивать чужие объекты User. Проблема в том, что когда приходит пакет размером 0 (клиент отключился) - нужно данный объект User, выделенный в хипе, удалить, то неизвествено работают ли с этим объектом другие потоки.
Пока я использую потокобезапасные умные указатели с подсчетом ссылок. но: существуют ли другие решения этой проблемы? есть ли open-source подобные сервера? и не выгоднее в плане производительности переписать сервер на java? |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Хорошее, кстати, решение. Вопрос только, как Вы их используете... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Vadimik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
feodorv, если вы про их подводные камни, например, циклические ссылки, то в моей задаче таких пробелм быть не может
|
|||
|
||||
| tzirechnoy |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Конечно. Масса. Например, использовать не подсчёт ссылок, а классический обход для garbage collection. Или, например, удалять объект сразу, и при удалении - обходить все места, в которых он мог быть запомнен (сверху вниз -- т.е. от твоей очереди или от полного списка игровых досок, или снизу вверх -- запоминать в объекте все ссылки на объекты, которые его используют), и везде, где найдёшь -- обнулять этот объект. Возможно, опять очередью на отложэнное действие для сериализацыи, если объект заблокирован. Ну, и проверять каждый раз доступность объекта при попытке доступа к нему (благо, в C++ для этого достаточно правильно написать его класс). Или, например, вообще не удалять объекты user до перезагрузки сервера. Если пользователи -- регистрируются, то их будет немного, какие-то сотни тысяч, можно всегда держать в памяти. В общем, можно выдумать кучу решэний -- но чем тебя текущее неустраивает? Вполне вариант.
В плане производительности обычно выгоднее всего -- применять профайлер и мозг. |
||||
|
|||||
| Vadimik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
Здесь вы меня поймали - имел в виду более рациональное решение. Просто у меня щас кривая реализация умных уазателей, хотя если переменные кол-во ссылок вставить в сам User и использовать атомарные операции, то получиться неплохой вариант. Касательно gc, у меня тоже была идея его реализовать, то почему бы не сделать его с дефрагментацией. А раз есть другие объекты подобные User, то можно использовать gc java (в то же время это его и слабое место, не считая прожорливость по памяти) - это меня и навело на мысль о java |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Гм. А как сейчас у Вас? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Vadimik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
feodorv, сейчас это я уже исправляю. А было сделано (торопился тогда и взял готовую реализацию) через map <User *, int> да ещё и обернут мьютексом.
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Тогда, да, это не оптимальный вариант.
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |