Здравствуйте, 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 потоков
???