Я пишу сервер для онлайн-игры, основанной на 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.
Я полностью сбит с толку. Будет очень полезно, если кто-нибудь скажет мне, что делать. Спасибо!
Похоже, проблема многопоточности.
Кстати, я вижу, вы используете критический раздел вокруг ClearReady
но не при тестировании на AllReady
, Этот вызов также должен быть упакован (или, лучше, написать LockedAllReady
который использует замок).
//cout<<"Return msg "<<now_playernum<<": "<<ret.msg<<endl;
Что вы имеете в виду под ret.msg? если msg — метод, вы должны выполнить ret.msg (); это поле?
Если у вас есть это хорошо, то, как они говорят выше, вероятно, проблема времени, попробуйте сделать cout без ret.msg
и посмотрим, что произойдет, и тогда ты узнаешь, откуда проблема.