为什么在发布模式下无法访问 for 循环,但在调试中它工作正常

Why isn´t the for loop accessed in release mode, but in debug it works fine

本文关键字:调试 循环 工作 for 布模式 模式 为什么 访问      更新时间:2023-10-16

我的问题是我在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


结果应该是服务器具有连接的袜子列表,并将消息分发给每个人。现在,当我在调试模式下运行它时,一切正常。可能是什么问题?

您的代码在两个线程之间缺少任何形式的同步。工作线程写入数据,主线程读取数据。但是由于它们之间没有同步(互斥/原子/等(,因此从主线程的每次读取都是与来自工作线程的写入的数据竞争。

数据竞赛是未定义的行为。因此,编译器可以编译主线程,就好像没有人写入数据一样。

当您将std::cout放入循环中时,这"有效"std::cout因为需要某种形式的同步来防止多个线程同时写入 stdout。因此,您实际上是在捎带这种内部同步。但你不应该依赖它;应改用适当的同步基元。