Увеличить точку останова потока

#c #multithreading #boost

#c #многопоточность #повысить

Вопрос:

Я использую 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(amp;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. Переменный итератор предназначен для отслеживания соединения с сокетом (он падает до нуля, если получены какие-либо данные от клиентов).
Моя проблема в том:
Перед запуском программы я могу установить точку останова в итераторе ad, но после его запуска точка останова снижается до оператора if («if (Client_to_handle-> clientSock-> available())»). Более того, если я установлю точку останова, например, в «if (Client_to_handle-> clientSock-> available())» и остановлю программу там, тогда отладчик скажет, что итератор переменной не определен. И программа никогда не нажимает «else if (iterator> = 10)», она просто проходит через это, чтобы повысить функцию 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));
    }
}
  

Ответ №1:

(Я хотел бы прокомментировать, но пока не имею на это прав!)

Вы уверены, что выполняете правильную «отладочную» сборку, в которой все символы все еще остаются на месте? Может случиться так, что у вас включена оптимизация компилятора, что может привести к изменению порядка операторов и может полностью исключить переменные.

Я оставляю ссылку на флаги оптимизации VC : https://msdn.microsoft.com/en-us/library/k1ack8f1.aspx?f=255amp;MSPPError=-2147217396

Проверьте свои флаги компилятора и посмотрите, есть ли у вас там какие-нибудь /O .