MinGW의 스레딩 클래스 지원이 부족하여 boost async를 사용하고 있습니다.C++ 이상한 비동기 동작
따라서 패킷을 5 초마다 보내려하고이 목적으로 boost::async
(std::async
)을 사용하기로 결정했습니다.
m_sendBuf = new char[1024]; // allocate buffer
[..]
bool CNetwork::Send(const void* sourceBuffer, size_t size) {
size_t bufDif = m_sendBufSize - m_sendInBufPos;
if (size > bufDif) {
return false;
}
memcpy(m_sendBuf + m_sendInBufPos, sourceBuffer, size);
m_sendInBufPos += size;
return true;
}
패킷 전송 코드
이
내가 패킷을 (- - 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()
을 호출하면 수신 된 패킷의 형식이 서버 측에서 잘못되어 데이터가 지정된 것과 다를 수 있습니다. 이것은 비동기 호출 밖에서 호출 될 때 발생하지 않습니다.
여기에 무슨 일이 일어나고 있습니까? 나는 아이디어가 없어.
관련 없음 : "MinGW에서 스레딩 클래스 지원이 부족합니다." MinGW 사본은 꽤 오래되었습니다. 명령 줄에 -std = C++ 0x 또는 -std = C++ 11을 추가 했습니까? – user4581301
'// 재귀적인 끝없는 호출'왜 재귀? 결국 자동 스토리지가 부족하게됩니다. – user4581301
@ user4581301 나는 그것이 영원히 돌아 가기를 원하기 때문입니다. 나는 그것이 무한 루프를하는 것보다 낫다고 생각한다. – Kesse