C++ C++;奇怪的异步行为
注意,由于MinGW中缺少线程类支持,我使用的是boostasync 因此,我想每5秒发送一个数据包,并决定为此使用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
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);