#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
.