Здравствуйте, .erax, Вы писали:
1. при добавлении пакетов в очередь, надо ее блокировать. у тебя этим и не пахнет
2. std::queue не имеет метода Pop(), у нее есть front() и pop()
3. нафига столько блокировок в основном цикле? вот версия с критической секцией:
bool bTask;
while(!bFinish || !tasks.empty())
{
bTask = !tasks.empty();
if(bTask)
{
cs.Lock();
if(!tasks.empty())
{
task = tasks.front();
tasks.pop();
}
cs.Unlock();
}
if(task)
{
//...
}
else
{
::Sleep(50);
}
}
суть в том, чтобы входить в крит. секцию, только когда это действительно необходимо. а у тебя получется все время происходит синхронизация
4. в cMPPacketQueue::Push(SServerPacket *_packet) нужен семафор на m_QueueMaxLimit потоков