| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Алгоритм удаления клиента IOCP |
| Автор: REZiaMIX 17.11.2009, 12:39 | ||||||||
| Столкнулся со следюущей проблемой: Пул потоков: допустим два потока(> 1) Идет прием пакетов , без особой обработки. Если в пришедшем буффере первый символ '*'
Тогда начинаем массовую рассылку всем клиентам сервера буффера "Broadcast!"(не суть) В процедуре массовой рассылки:
Где RemoveClient - процедура удаления из списка клиентов(вектор) с необходимой защитой критическими секциями. Объект Client создается при подключении:
Процедура RemoveClient:
И вот , при массовой рассылке происходит ошибка отправки(клиент резко отключился!) , Client удаляется из вектора , и удаляется delet'ом. Но в это время(поток2) уже начал принимать новый буффер от отключаемого клиента и обращается к методам по уже несуществующему объекту(указатель то уже невалиден) Каким образом синхронизировать всю эту чепуху? Пока в голову приходит только блокировать массив(или его части, несколькими крит.секциями) клиентов при начале любой обработки в потоке? |
| Автор: xvr 17.11.2009, 14:53 | ||
| В каждом клиенте сделать счетчик InUse, который должен считать количество потоков, в которых для данного клиента что то сейчас делается. Так же вводится флаг DeletePending, который говорит, что при общении с клиентом произошла ошибка. Добавляется 2 процедуры и изменяется RemoveClient:
|
| Автор: REZiaMIX 17.11.2009, 15:04 |
| Спасибо , очень понравилось такое решение |