С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 60
1

Безопасный список в многопоточной программе

17.07.2006, 16:10. Показов 2704. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в программе глобальный список и гроков, которые в данный момент есть на сервере. Программа многопоточная, то есть, грубо говоря, для каждой игры создаётся поток, и все потоки лазают к этому списку, добавляют элементы, удаляют, модифицируют. Создан класс PLAYER, там несколько перемнных и массивов. И класс PLIST, который поддерживает всю логику работы с списком объектов. Это вступление.
Вопрос. Как организовать всё это безопасно для многопоточной программы?
Использовать в вызывающем коде входы и выходы в одну глобальную критическую секцию - не очень правильно, до фига места займёт и не красиво.
Я в самом объекте PLIST завёл критическую секцию и каждаю публичная функция работы со списком вначале входит в неё, а при выходе выходит.
Но возникает другая проблема. Предположим, я вызвал функцию поиска. Она корректно отработала и вернула мне указатель на найденный объект списка, НО... Использовать этот указатель нельзя. Другая нить могла уже грохнуть объект по нему.
Получается надо, чтобы при вызове фунок работы со списком они внутри вызывали блокировку, а в вызывающем коде при завершении работы с тем, что ни вернули, вручную вызываьб разблокировку.
Вобщем, замкнутый круг, помогите чем можите. Хочется покарсивше и поизящней. ОЧЕНЬ ЖЕЛАТЕЛЬНО на чистом си++.
Какие есть вообще подходы к решению проблемы? Наверняка я не первый. Что-то же человечество должно было придумать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
17.07.2006, 16:10
Ответы с готовыми решениями:

Метод For в многопоточной программе
Почему данный код не компилируется и как исправить ошибку? using System; using...

Ошибка в многопоточной программе
Здравствуйте! Есть простая программа, которая выдает список всех папок в заданной папке (включая...

Одновременный инкремент в многопоточной программе
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные переменные. Каждый поток...

Функция с fprintf в многопоточной программе
Насколько я знаю, fprintf не многопоточен. Т.е. я не могу просто взять и использовать fprintf() в...

4
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
17.07.2006, 16:40 2
Используй SmartPointer для хранения объектов в списке и ссылки на них, тогда, даже если объект удален из списка, то он будет сущесвовать до тех пор, пока кто-нибудь на него ссылается.



Удачи,

Владимир
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 60
18.07.2006, 03:57  [ТС] 3
не совсем то

таким образом мы избегаем грубого крэша программы, но логические ошибки остаются



Вобщем, имхо, нефиг наружу выдавать указатели на потроха объекта. Таким образом нарушается инкапсуляция. Так что придётся много чего переделывать. Всю работы с элементами списка только через члены класса, ибо нефиг. Соответственно, все блокировки/разблокировки внутри функций-членов класса этого списка.
0
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
18.07.2006, 04:29 4
Как вариант, ваше решение тоже подходит, кроме того при возвращении элемента из массива, если они не тяжелые, то можно возвращать не указатель на элемент, а его копию, вообще стратегий в данном случае много, нужно лишь выбрать разумную для вашей конкретной задачи.



С уважением,

Владимир
0
0 / 0 / 0
Регистрация: 14.06.2006
Сообщений: 9
18.07.2006, 13:24 5
pthread_mutex_t
0
18.07.2006, 13:24
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
18.07.2006, 13:24
Помогаю со студенческими работами здесь

Умножение матриц в многопоточной программе
class Program { static int value = 50; static void Main(string args) ...

Назначение параметров в многопоточной программе
Ребят от чего зависит вот эти параметры в моей программе? Mythread t1 = new...

Устранение узкого места в многопоточной программе
Доброго времени суток, столкнулся с узким местом при разработке много поточной программы на питоне....

Медленная работа и ловля исключений в многопоточной программе
Здравствуйте. Сразу хочу предупредить, что это мой первый проект поэтому судите строго, но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru