Почему этот код не работает, когда комментарии комментируются?

Я пишу сервер для онлайн-игры, основанной на IOCP, и ядро, обрабатывающее сообщения игры, выглядит примерно так:

CMessage ret;
int now_roomnum = recv_msg->para1;
int now_playernum = recv_msg->para2;
/*if(true)
{
cout<<"Received Game Message: "<<endl;
cout<<"type2 = "<<recv_msg->type2;
cout<<" player_num = "<<now_playernum<<" msg= "<<recv_msg->msg<<endl;

cout<<endl;
}*/

if(recv_msg->type2 == MSG_GAME_OPERATION)
{
ret.type1 = MSG_GAME;
ret.type2 = MSG_GAME_OPERATION;

while(game_host[now_roomnum].Ready(now_playernum) == true)
{
;
}
//cout<<"Entered from "<<now_playernum<<endl;

game_host[now_roomnum].SetMessage(now_playernum, recv_msg->msg);
game_host[now_roomnum].SetReady(now_playernum, true);
game_host[now_roomnum].SetUsed(now_playernum, false);

while(true)
{
bool tmp = game_host[now_roomnum].AllReady();
if(tmp == true)
break;
}

//cout<<"AllReady from"<<now_playernum<<endl;

string all_msg = game_host[now_roomnum].GetAllMessage();
game_host[now_roomnum].SetUsed(now_playernum, true);

while(!game_host[now_roomnum].AllUsed())
{
;
}

//cout<<"AllUsed from "<<now_playernum<<endl;

EnterCriticalSection(&cs);
game_host[now_roomnum].ClearReady();
LeaveCriticalSection(&cs);

strcpy_s(ret.msg, all_msg.c_str());

//cout<<"Return msg "<<now_playernum<<": "<<ret.msg<<endl;

}

return ret;

Теперь проблема: на ПК, когда все cout комментируются как выше, игра сразу же зависает; но когда я отменяю комментарии, сервер работает хорошо.

Более того, когда я запускаю сервер на своем ноутбуке, все идет хорошо, независимо от того, комментирую ли я cout или нет. Основное различие между моим ноутбуком и ПК заключается в том, что ОС моего ноутбука — Windows 8.1, а ПК — Windows 7.

Я полностью сбит с толку. Будет очень полезно, если кто-нибудь скажет мне, что делать. Спасибо!

0

Решение

Похоже, проблема многопоточности.

Кстати, я вижу, вы используете критический раздел вокруг ClearReady но не при тестировании на AllReady, Этот вызов также должен быть упакован (или, лучше, написать LockedAllReady который использует замок).

0

Другие решения

//cout<<"Return msg "<<now_playernum<<": "<<ret.msg<<endl;

Что вы имеете в виду под ret.msg? если msg — метод, вы должны выполнить ret.msg (); это поле?

Если у вас есть это хорошо, то, как они говорят выше, вероятно, проблема времени, попробуйте сделать cout без ret.msg и посмотрим, что произойдет, и тогда ты узнаешь, откуда проблема.

0

По вопросам рекламы [email protected]