безопасный список в многопоточной программе
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



безопасный список в многопоточной программе Expand / Collapse
Автор
Сообщение
17.07.2006 12:10
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 04.09.2007 19:56
Сообщ.: 42, Visits: 337
Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в программе глобальный список и гроков, которые в данный момент есть на сервере. Программа многопоточная, то есть, грубо говоря, для каждой игры создаётся поток, и все потоки лазают к этому списку, добавляют элементы, удаляют, модифицируют. Создан класс PLAYER, там несколько перемнных и массивов. И класс PLIST, который поддерживает всю логику работы с списком объектов. Это вступление.

Вопрос. Как организовать всё это безопасно для многопоточной программы?

Использовать в вызывающем коде входы и выходы в одну глобальную критическую секцию - не очень правильно, до фига места займёт и не красиво.

Я в самом объекте PLIST завёл критическую секцию и каждаю публичная функция работы со списком вначале входит в неё, а при выходе выходит.

Но возникает другая проблема. Предположим, я вызвал функцию поиска. Она корректно отработала и вернула мне указатель на найденный объект списка, НО... Использовать этот указатель нельзя. Другая нить могла уже грохнуть объект по нему.

Получается надо, чтобы при вызове фунок работы со списком они внутри вызывали блокировку, а в вызывающем коде при завершении работы с тем, что ни вернули, вручную вызываьб разблокировку.

Вобщем, замкнутый круг, помогите чем можите. Хочется покарсивше и поизящней. ОЧЕНЬ ЖЕЛАТЕЛЬНО на чистом си++.

Какие есть вообще подходы к решению проблемы? Наверняка я не первый. Что-то же человечество должно было придумать.

Сообщ. #900846
17.07.2006 12:40
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
Используй SmartPointer для хранения объектов в списке и ссылки на них, тогда, даже если объект удален из списка, то он будет сущесвовать до тех пор, пока кто-нибудь на него ссылается.

Удачи,
Владимир
Сообщ. #900849
17.07.2006 23:57
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 04.09.2007 19:56
Сообщ.: 42, Visits: 337
не совсем то
таким образом мы избегаем грубого крэша программы, но логические ошибки остаются

Вобщем, имхо, нефиг наружу выдавать указатели на потроха объекта. Таким образом нарушается инкапсуляция. Так что придётся много чего переделывать. Всю работы с элементами списка только через члены класса, ибо нефиг. Соответственно, все блокировки/разблокировки внутри функций-членов класса этого списка.
Сообщ. #900909
18.07.2006 0:29
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
Как вариант, ваше решение тоже подходит, кроме того при возвращении элемента из массива, если они не тяжелые, то можно возвращать не указатель на элемент, а его копию, вообще стратегий в данном случае много, нужно лишь выбрать разумную для вашей конкретной задачи.

С уважением,
Владимир
Сообщ. #900912
18.07.2006 9:24


новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 12.11.2006 13:11
Сообщ.: 9, Visits: 12
pthread_mutex_t
Сообщ. #900925
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 5:44