2017-11-06 8 views
1

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()을 호출하면 수신 된 패킷의 형식이 서버 측에서 잘못되어 데이터가 지정된 것과 다를 수 있습니다. 이것은 비동기 호출 밖에서 호출 될 때 발생하지 않습니다.

여기에 무슨 일이 일어나고 있습니까? 나는 아이디어가 없어.

+0

관련 없음 : "MinGW에서 스레딩 클래스 지원이 부족합니다." MinGW 사본은 꽤 오래되었습니다. 명령 줄에 -std = C++ 0x 또는 -std = C++ 11을 추가 했습니까? – user4581301

+1

'// 재귀적인 끝없는 호출'왜 재귀? 결국 자동 스토리지가 부족하게됩니다. – user4581301

+0

@ user4581301 나는 그것이 영원히 돌아 가기를 원하기 때문입니다. 나는 그것이 무한 루프를하는 것보다 낫다고 생각한다. – Kesse

답변

0

나는 당신이 여기서하고있는 일을 감싸고 있다고 생각합니다. 하나의 스레드에서 버퍼에 모든 미 전송을로드 한 다음 다른 스레드에서 버퍼를 플러시 중입니다. 패킷이 겹치지 않는다고 생각하더라도 (충분히 빨리 소비되었다고 가정 할 때) 모든 공유 데이터를 동기화해야합니다.

m_sendBuf, m_sendInPosm_sendBufSize은 모두 memcpy 또는 버퍼 크기 논리가 실행되는 동안 주 스레드에서 읽혀질 수 있습니다. 장기적으로 의도 한대로 프로그램을 작동 시키려면 적절한 대기열을 사용해야하지만 뮤텍스로 해당 변수를 보호 해보십시오.

또한 다른 주석가들이 지적했듯이 무한 재귀는 C++에서 지원되지 않지만 아마도 잘못된 형식의 패킷에는 영향을주지 않습니다.