2017-11-06 9 views
1

MinGWのスレッドクラスサポートが不足しているため、私はboost asyncを使用しています。C++の不思議な非同期動作

このため、パケットを5秒ごとに送信し、boost::asyncstd::async)を使用することにしました。

これは私がパケットを送信するために使用する機能です(これは実際にバッファにコピーし、メインアプリケーションループに送信している - NVM! - それは罰金外の非同期メソッドを働いている)

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; 
} 

コードを送信パケット:

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

私はあなたがここでやっていることに頭を抱えていると思います。すべての未送信のバッファを1つのスレッドでロードし、別のスレッドでバッファをフラッシュしています。パケットが重複していなくても(十分に速く消費されたと仮定しても)、すべての共有データを同期させます。

m_sendBuf,m_sendInPos、およびm_sendBufSizeはすべてメインスレッドから読み込まれています。おそらくmemcpyまたはバッファサイズロジックが実行されている間です。長期的に意図したとおりにプログラムを動作させるために適切なキューを使用する必要があると思われますが、これらの変数をmutexで保護してみてください。

また、他のコメント者からも指摘されているように、無限再帰はC++ではサポートされていませんが、不正な形式のパケットにはあまり寄与しません。

関連する問題