Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Zerg1
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 52
#1

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

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

Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в программе глобальный список и гроков, которые в данный момент есть на сервере. Программа многопоточная, то есть, грубо говоря, для каждой игры создаётся поток, и все потоки лазают к этому списку, добавляют элементы, удаляют, модифицируют. Создан класс PLAYER, там несколько перемнных и массивов. И класс PLIST, который поддерживает всю логику работы с списком объектов. Это вступление.
Вопрос. Как организовать всё это безопасно для многопоточной программы?
Использовать в вызывающем коде входы и выходы в одну глобальную критическую секцию - не очень правильно, до фига места займёт и не красиво.
Я в самом объекте PLIST завёл критическую секцию и каждаю публичная функция работы со списком вначале входит в неё, а при выходе выходит.
Но возникает другая проблема. Предположим, я вызвал функцию поиска. Она корректно отработала и вернула мне указатель на найденный объект списка, НО... Использовать этот указатель нельзя. Другая нить могла уже грохнуть объект по нему.
Получается надо, чтобы при вызове фунок работы со списком они внутри вызывали блокировку, а в вызывающем коде при завершении работы с тем, что ни вернули, вручную вызываьб разблокировку.
Вобщем, замкнутый круг, помогите чем можите. Хочется покарсивше и поизящней. ОЧЕНЬ ЖЕЛАТЕЛЬНО на чистом си++.
Какие есть вообще подходы к решению проблемы? Наверняка я не первый. Что-то же человечество должно было придумать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2006, 16:10     Безопасный список в многопоточной программе
Посмотрите здесь:

Рассинхрон многопоточной программы - C++
Добрый вечер. Имеется многопоточная программа, работает при нажатии цифровых клавиш (прибавление) а так же при сочетании Alt+цифра...

Ошибка в программе Двусвязный список - C++
Помогите пожалуйста исправить ошибку в программе! Проблема в том, что при добавлении 4 и более записей в список и удалении всех их,...

Создание простой многопоточной программы - C++
Здравствуйте спецы. Никак не могу разобраться с многопоточностью. Помогите на простом примере разобраться с этим. ...

список (в программе обнуляются указатели на структуры) - C++
здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн он обнуляется, это меня сбивает с толку...

Безопасный массив - C++
Здравствуйте,помогите пожалуйста,как подстроить данную программу под безопасный массив (контроль границ).Своими силами не...

Безопасный ввод с консоли - C++
Добрый день есть функция безопасного ввода чисел в консоли: int Protocol::SafeIn() { int k, n = 0, flgS = 0, c = 0, q = 0; ...

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



Удачи,

Владимир
Zerg1
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 52
18.07.2006, 03:57  [ТС]     Безопасный список в многопоточной программе #3
не совсем то

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



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



С уважением,

Владимир
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2006, 13:24     Безопасный список в многопоточной программе
Еще ссылки по теме:

Разработать безопасный класс с идиомой pimpl - C++
Почему этот код у меня не компилируеться? И правильный ли выбран подход для решения обеспечения безопасности исключений?#ifndef WIDGET_H ...

программка должна генерировать безопасный пароль - C++
вероятность подбора-Р=10 в минус 5 степени. скорость перебора паролей-V= 15 паролей\мин. максимальный срок действия пароля-Т=2неделли....

Безопасный ввод через функцию-шаблон - C++
Безопасный ввод через функцию-шаблон Запись от -=ЮрА=- размещена 02.01.2013 в 19:01 Обновил(-а) -=ЮрА=- 11.02.2013 в 12:23 К моему...

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы - C++
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

Создать список L3 из элементов, входящих и в список L1 и в список L2 - C++
создать список л3 из элементов входящих и в список л1 и в список л2

Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы - C++
Помогите не знаю как сделать! Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы. Безопасный...


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

Или воспользуйтесь поиском по форуму:
ftor
0 / 0 / 0
Регистрация: 14.06.2006
Сообщений: 9
18.07.2006, 13:24     Безопасный список в многопоточной программе #5
pthread_mutex_t
Yandex
Объявления
18.07.2006, 13:24     Безопасный список в многопоточной программе
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru