![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| REZiaMIX |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Столкнулся со следюущей проблемой:
Пул потоков: допустим два потока(> 1) Идет прием пакетов , без особой обработки. Если в пришедшем буффере первый символ '*'
Тогда начинаем массовую рассылку всем клиентам сервера буффера "Broadcast!"(не суть) В процедуре массовой рассылки:
Где RemoveClient - процедура удаления из списка клиентов(вектор) с необходимой защитой критическими секциями. Объект Client создается при подключении:
Процедура RemoveClient:
И вот , при массовой рассылке происходит ошибка отправки(клиент резко отключился!) , Client удаляется из вектора , и удаляется delet'ом. Но в это время(поток2) уже начал принимать новый буффер от отключаемого клиента и обращается к методам по уже несуществующему объекту(указатель то уже невалиден) Каким образом синхронизировать всю эту чепуху? Пока в голову приходит только блокировать массив(или его части, несколькими крит.секциями) клиентов при начале любой обработки в потоке? Это сообщение отредактировал(а) REZiaMIX - 17.11.2009, 12:45 -------------------- ![]() |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В каждом клиенте сделать счетчик InUse, который должен считать количество потоков, в которых для данного клиента что то сейчас делается. Так же вводится флаг DeletePending, который говорит, что при общении с клиентом произошла ошибка.
Добавляется 2 процедуры и изменяется RemoveClient:
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Спасибо , очень понравилось такое решение
-------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |