Почему цикл for не доступен в режиме выпуска, но в режиме отладки работает нормально? - PullRequest
0 голосов
/ 15 апреля 2019

Моя проблема в том, что я запрограммировал серверное / клиентское приложение на Windows.Теперь в режиме отладки все работает нормально и как надо, но в режиме выпуска сервер не принимает и не отправляет сообщения.

Я думаю, это связано с тем, что цикл for внутри бесконечного цикла for не доступен. Я также пытался реализовать это решение некоторое время, но оно не сработало.Я думаю, что может быть проблема в том, что я вызываю функцию в поле условия, потому что, когда я сравниваю i с целым числом, к нему получают доступ.Также интересно то, что когда я что-то std :: cout прямо перед внутренним циклом for, доступ к циклу также осуществляется, несмотря на то, что я вызываю функцию в поле условия.

#include <iostream>
#include <thread>
#include "server.cpp"

//gets defined in server.cpp
void server::acceptConn() {
    u_long mode =1;
    for(;;){
        int len = sizeof(incAddr[connectedSocks]);
        if((inc_sock[connectedSocks] = accept(serv,(struct sockaddr *)&incAddr[connectedSocks],&len))!= SOCKET_ERROR){
            std::cout<<"client connected : "<<inet_ntoa(incAddr[connectedSocks].sin_addr)<<std::endl;
            ioctlsocket(inc_sock[connectedSocks],FIONBIO,&mode);
            connectedSocks++;
        }
    }
}

int main() {
    server ser;
    ser.init_Server();
    std::thread t(&server::acceptConn,&ser);
    char buf[1024];
    for(;;){
        for(int i=0 ; ser.getCounter()>i;i++){
            if (recv(ser.getInc_Sock()[i], buf, sizeof(buf), 0) == SOCKET_ERROR) {

            } else{
                for (int x = 0; x < ser.getCounter(); x++) {
                    if(x==i){//just that the message doesnt get send back to the sender}
                    else{
                        if (send(ser.getInc_Sock()[x], buf, sizeof(buf), 0) == SOCKET_ERROR) {
                            std::cout<<"send failed : "<<WSAGetLastError()<<std::endl;
                        }
                    }
                }
            }
        }
    }
}

int getCounter(){return  connectedSocks;};//in server.h




В результате сервер должен иметь список подключенных носков и рассылать сообщения всем.Теперь, когда я запускаю его в режиме отладки, все работает нормально.В чем может быть проблема?

1 Ответ

1 голос
/ 15 апреля 2019

В вашем коде отсутствует какая-либо форма синхронизации между двумя потоками.Рабочий поток записывает данные, а основной поток читает данные.Но поскольку между ними нет синхронизации (мьютекс / атомикс / и т. Д.), Каждое чтение из основного потока является гонкой данных с записями из рабочего потока.

А гонки данных - неопределенное поведение.Таким образом, компилятору разрешено компилировать основной поток, как если бы никто никогда не записывал данные .

Когда вы помещаете std::cout в свои циклы, это «работает», потому что std::cout требует некоторогоформа синхронизации, чтобы не допустить одновременной записи нескольких потоков на стандартный вывод.Таким образом, вы эффективно пользуетесь этой внутренней синхронизацией.Но вы не должны полагаться на это;вместо этого вы должны использовать правильные примитивы синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...