作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题很简单,我用 Boost Asio 做了一个服务器。它运作良好。问题是当我启动 std::thread 时,我无法再与服务器通信。
你能告诉我为什么吗?因为我真的不明白。谢谢!
这是我处理收到的内容的函数:
void Server::handleCmd()
{
if (isClientExist() == false) {
addClient();
}
_vTmpString = Tools::splitString(_cmd, ' ');
_idCmd = Tools::stringToInt(_vTmpString[0]);
switch (_idCmd)
{
case CREATEROOM:
createRoom();
break;
case DISCONNECTION:
delClient();
break;
case GETROOM:
getVectorRoomsForClients();
break;
case JOINROOM:
joinRoom();
break;
case LEAVEROOM:
leaveRoom();
break;
case STARTROOM:
startGame();
break;
}
}
启动线程的函数:
void Server::startGame()
{
_vTmpString = Tools::splitString(_cmd, ' ');
if (_vTmpString.size() != 2 && Tools::isNumber(_vTmpString[1]) == true)
return;
_tmpCmd = _vTmpString[0];
_tmpIdRoom = std::stoi(_vTmpString[1]);
if (_vTmpString.size() == 2 && _tmpCmd == "startroom" && _tmpIdRoom < 10000) {
sendMsg("OK\n");
std::cout << "CLIENT " << _remoteEndPoint << " ASKS FOR STARTING THE ROOM " << CYAN << _tmpIdRoom << DEFAULT << " : " << GREEN << "OK" << DEFAULT << std::endl;
std::thread launchGame(&Server::gameLoop, this, _tmpIdRoom);
launchGame.join();
} else {
sendMsg("KO\n");
std::cout << "CLIENT " << _remoteEndPoint << "ASKS FOR STARTING THE ROOM " << CYAN << _tmpIdRoom << DEFAULT << " : " << GREEN << "KO" << DEFAULT << std::endl;
}
}
一旦进入线程,如果我尝试发送任何已知命令,服务器将不再响应。 _cmd 在我启动服务器之前发送的最后一个命令上被阻止,它的意思是“startroom”。
最佳答案
launchGame.join()
阻塞,直到线程终止。由于该线程显然在运行一个游戏循环,因此它暂时不会终止。在这一点上加入它毫无意义。
关于c++ - 通信在线程中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53947081/
我是一名优秀的程序员,十分优秀!