为什么在发布模式下无法访问 for 循环,但在调试中它工作正常
Why isn´t the for loop accessed in release mode, but in debug it works fine
我的问题是我在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。因此,您实际上是在捎带这种内部同步。但你不应该依赖它;应改用适当的同步基元。
相关文章:
- 如何循环打印顶点结构
- 当回溯以零开始时,如何调试崩溃
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- USACO珠子,无法在循环时调试
- 如何调试我的 while 循环C++程序?
- 为什么在发布模式下无法访问 for 循环,但在调试中它工作正常
- 如何调试为什么Arduino会中断while循环
- 在调试线程时无限循环
- 代码块 13.12 C++基本的循环调试错误
- C++Visual Studio-运算符重载中的Empty For循环导致调试错误
- 你能调试自动矢量化循环吗
- 调试过程中的无限循环
- For循环在调试器中不能正常工作
- Visual C++,使用相同迭代器名称的多个for循环,在调试模式下在范围外可见
- visual studio 2010 - c++ VS2010调试器在超出循环作用域的循环变量上表现奇怪