C++ C++;奇怪的异步行为

C++ C++;奇怪的异步行为,c++,multithreading,asynchronous,boost,C++,Multithreading,Asynchronous,Boost,注意,由于MinGW中缺少线程类支持,我使用的是boostasync 因此,我想每5秒发送一个数据包,并决定为此使用boost::async(std::async) 这是我用来发送数据包的函数(实际上是复制到缓冲区并在主应用程序循环中发送-nvm-它在异步方法之外工作得很好!) 数据包发送代码: struct TestPacket { unsigned char type; int code; }; void SendPacket() { TestPacket myP

注意,由于MinGW中缺少线程类支持,我使用的是boostasync

因此,我想每5秒发送一个数据包,并决定为此使用
boost::async
std::async

这是我用来发送数据包的函数(实际上是复制到缓冲区并在主应用程序循环中发送-nvm-它在异步方法之外工作得很好!)

数据包发送代码:

struct TestPacket {
    unsigned char type;
    int code;
};


void SendPacket() {
    TestPacket myPacket{};

    myPacket.type = 10;
    myPacket.code = 1234;

    Send(&TestPacket, sizeof(myPacket));
}
异步代码:

void StartPacketSending() {
    SendPacket();
    std::this_thread::sleep_for(std::chrono::seconds{5});
    StartPacketSending(); // Recursive endless call
}

boost::async(boost::launch::async, &StartPacketSending);
好的。所以问题是,当我从异步方法调用
SendPacket()
时,收到的数据包在服务器端的格式不正确,并且数据与指定的不同。在异步调用外部调用时不会发生这种情况


这是怎么回事?我没有主意了

我想我对你在这里所做的事很感兴趣。您正在一个线程中将所有未发送的内容加载到缓冲区中,然后在另一个线程中刷新它。即使数据包没有重叠(假设它们被足够快地使用),您仍然需要同步所有共享数据

m_sendBuf
m_sendInPos
m_sendBufSize
都是从主线程读取的,很可能是在memcpy或缓冲区大小逻辑运行时读取的。我怀疑您必须使用适当的队列才能使程序在长期内按预期工作,但请尝试使用互斥来保护这些变量


也如其他评论家指出的,C++中不支持无限递归,但这可能对你的错误包没有贡献。

< P>我认为我的头脑是围绕着你在这里做的。您正在一个线程中将所有未发送的内容加载到缓冲区中,然后在另一个线程中刷新它。即使数据包没有重叠(假设它们被足够快地使用),您仍然需要同步所有共享数据

m_sendBuf
m_sendInPos
m_sendBufSize
都是从主线程读取的,很可能是在memcpy或缓冲区大小逻辑运行时读取的。我怀疑您必须使用适当的队列才能使程序在长期内按预期工作,但请尝试使用互斥来保护这些变量


也如其他评论家指出的,C++中不支持无限递归,但这可能对你的畸形包没有贡献。

无关:“由于MinGW中缺少线程类支持。”您是否尝试将-std=c++0x或-std=c++11添加到命令行中?
//递归无止境调用
为什么递归?您最终将耗尽自动存储。@user4581301,因为我希望它永远运行。我认为这比拥有无限循环要好。它不会永远运行。最有可能的结果是程序从堆栈的末尾运行,程序崩溃。无限循环是一种更温和、更稳定的解决方案。它将永远运行,或者直到堆栈空间耗尽为止,以先到者为准@用户4581301,我很确定你的意思是温和而不是非犹太人,是吗?在任何涉及某人犹太血统的句子中加入“解决方案”可能不是一个好主意:-)无关:“由于MinGW中缺少线程类支持。”你的MinGW副本一定很旧了。您是否尝试将-std=c++0x或-std=c++11添加到命令行中?
//递归无止境调用
为什么递归?您最终将耗尽自动存储。@user4581301,因为我希望它永远运行。我认为这比拥有无限循环要好。它不会永远运行。最有可能的结果是程序从堆栈的末尾运行,程序崩溃。无限循环是一种更温和、更稳定的解决方案。它将永远运行,或者直到堆栈空间耗尽为止,以先到者为准@用户4581301,我很确定你的意思是温和而不是非犹太人,是吗?在涉及某人犹太血统的任何句子中加入“解决方案”可能不是一个好主意:-)
void StartPacketSending() {
    SendPacket();
    std::this_thread::sleep_for(std::chrono::seconds{5});
    StartPacketSending(); // Recursive endless call
}

boost::async(boost::launch::async, &StartPacketSending);