c++ - Boost线程断点

标签 c++ multithreading boost

我使用的是 visual studio 2015。

我有主循环,我在其中处理与服务器的新连接:

void Server::acceptorLoop()
{
    acceptor = new boost::asio::ip::tcp::acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8001));//boost::asio::ip::address::from_string("xx.xx.xx.xx"), 80)

    std::cout << "Waiting for clients..." << std::endl;

    while (TRUE)
    {
        boost::asio::ip::tcp::socket* clientSock = new boost::asio::ip::tcp::socket (service);
        acceptor->accept(*clientSock);
        std::cout << "New client joined! " << std::endl;

        Client* new_client = new Client; //create new client
        new_client->clientSock = clientSock;
        new_client->last_read_request = "";
        new_client->activity = TRUE;
        new_client->request_thread = new boost::thread(&Server::HandleRequest, this, new_client);//new thread with handling client requests

        mtx.lock();
        clients_list->push_back(new_client);
        mtx.unlock();
        std::cout << "Total clients:" << clients_list->size() << std::endl;
    }
}

新套接字连接后,新的 HandleRequest 线程启动。变量迭代器用于 ping 与套接字的连接(如果收到来自客户端的任何数据,它会降为零)。 我的问题是: 在我开始程序之前,我可以在迭代器广告上设置断点,但在它开始后,断点下降到 if 语句(“if(Client_to_handle->clientSock->available())”)。此外,如果我在“if (Client_to_handle->clientSock->available())”上设置断点并在那里停止程序,则调试器会说 undefined variable 迭代器。并且程序永远不会点击“else if (iterator >= 10)”,它只是通过它来 boost sleep 功能。 为什么我不能定义变量并且我的程序拒绝查看 else if 语句?

void Server::HandleRequest(Client * Client_to_handle)
{
    int iterator = 0;
    while (TRUE)
    {
        if (Client_to_handle->clientSock->available())
        {
            //do stuff and drop iterator to zero (connection active)
            iterator = 0;
        }
        else if (iterator >= 10) //program refuses to get in here
        {
            if (iterator == 20)
            {
                Client_to_handle->clientSock->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
                Client_to_handle->clientSock->close();
                Client_to_handle->activity = FALSE;
            }
            boost::asio::write(*Client_to_handle->clientSock, boost::asio::buffer("1|"));           
        }   
        boost::this_thread::sleep(boost::posix_time::millisec(1000));
    }
}

最佳答案

(我想发表评论,但还没有权限!)

您确定您正在运行正确的“调试”构建,其中所有符号都保留在原位吗?可能会发生,您启用了编译器优化,这可能会导致更改语句的顺序并可能完全消除变量。

我留下指向 VC++ 优化标志的链接:https://msdn.microsoft.com/en-us/library/k1ack8f1.aspx?f=255&MSPPError=-2147217396

检查你的编译器标志,看看你那里是否有任何类型的 /O

关于c++ - Boost线程断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40190776/

相关文章:

c++ - 如何在 LLVM 过程中破坏然后分解函数?

c++ - 语言数组和 std::array 初始化之间有什么区别?

c# - 如何实现自动选择html中的项目并点击提交?

java - Selector.select 没有按预期阻塞

c++ - void* 指针类型的 boost 序列化无法编译

c++ - 将 std::complex 值的 boost::multi_array 复制到 mxArray

c++ - 使用引用对象初始化

java - 重构asynctask线程

c++ - boost 日志 : How to forward a loging source

vb.net - 进度条和代码位置的多线程(vb.net)?