线程中的通信丢失

Communication lost in thread

本文关键字:通信 线程      更新时间:2023-10-16

我的问题很简单,我已经用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("OKn");
                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("KOn");
                std::cout << "CLIENT " << _remoteEndPoint << "ASKS FOR STARTING THE ROOM " << CYAN << _tmpIdRoom << DEFAULT << " : " << GREEN << "KO" << DEFAULT << std::endl;
        }
}

一旦我进入线程,如果我尝试发送任何已知命令,服务器将不再响应。 _cmd在启动服务器之前发送的最后一个被阻止,这意味着"开始室"。

launchGame.join()块,直到线程终止。而且由于线程显然运行游戏循环,因此它不会在一段时间内终止。在这一点上加入它没有什么意义。