Re[4]: Проблема при работе с std::queue.
От: .erax  
Дата: 09.11.04 12:40
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, .erax, Вы писали:




ssm>1. при добавлении пакетов в очередь, надо ее блокировать. у тебя этим и не пахнет

Я же сказал что использую внешнюю синхроницацию.
ssm>2. std::queue не имеет метода Pop(), у нее есть front() и pop()

SServerPacket* cMPPacketQueue::Pop()
    {
        if(m_packetQueue.empty())
            return NULL;
        SServerPacket* _packet = NULL;
        try
        {
            _packet = m_packetQueue.front();
            assert(_packet);
            m_packetQueue.pop();
        }
        catch(...)
        {
            return NULL;
        }
        return _packet;
    }


ssm>3. нафига столько блокировок в основном цикле? вот версия с критической секцией:

ssm>суть в том, чтобы входить в крит. секцию, только когда это действительно необходимо. а у тебя получется все время происходит синхронизация
Да, я извиняюсь, что сразу не написал этого. Вчера тестировал момент
на возможность тормозов изза синхронизации. Вместо мютексов в винде используются крит. секции, ну а в Линуксе,- мютексы.
Дошло до того, что тело функций Lock() и Unlock() оставил пустыми, т.е. никакой синхронизации небыло вообще. Цирк в том, что тест стабильно проработал целую ночь, 5 компов с 300 клиентами на каждом, плюс 200 на локалхосте, итого 1700 клиентов, сам сервак разбился на 27 читающих потоков по 64 клиента на каждый, прлюс один поток-акцептор (в котором происходит вызов accept) и один поток для обработки очереди сообщений. Тест заключался в том, что клиент шлет пакет типа:

struct testPack
{
  DWORD dwTime;
  char dummyData[64K-sizeof(DWORD)];
}


сервер отправлает его обратно клиенту, на котором собирается статистика по времени прохождения пакета, модифицируется время и снова отправляется клиенту.
Прикол в том, что без синхронизации все отработало 16 часов без единого гюка. Через сервер прошло ~580 ГБ данных (89% с локалхоста).
Время ядра осталось на том же уровне.

Конечно можно сделать вывод о потокозащищенности std::queue .
Я ж говорю, что ядро грузится изза промахов по памяти.
ssm>4. в cMPPacketQueue::Push(SServerPacket *_packet) нужен семафор на m_QueueMaxLimit потоков
???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.