0

boosts を使用してデータのブロック/配列を送信できるプログラムを作成しようとしてasync_writeいるときに、スレッドで問題が発生した可能性があります。

これは私が実行したいものです:

write(unsigned char *pMsg, unsigned short nMsgLen){
      io_service_.post(boost::bind(&m_client::write_buf, this, pMsg, nMsgLen));
}

write_buf(unsigned char *pMsg, unsigned short nMsgLen){

          boost::asio::async_write(target,
                            boost::asio::buffer(pMsg, nMsgLen),
                            boost::bind(&m_client::write_buf_compl,
                            this,
                            boost::asio::placeholders::error));
}

コンパイルはしますが、呼び出されpMsgたときに正しい内容がありませんwrite_buf。同じスレッド内で呼び出されていないためだと思います。

では、この構成を調整して、配列をパラメーターとして転送するにはどうすればよいでしょうか?!

4

1 に答える 1

0

問題がどこにあるかをかなり理解しているようです。そのための簡単な修正は、そのコンテンツをコピーしてそのバッファーを渡すことです。

void write(unsigned char *pMsg, unsigned short nMsgLen) {
    // TODO: Take care of exception safety...
    char *pMsgCopy = (char *)malloc(nMsgLen);
    memcpy(pMsgCopy, pMsg, nMsgLen);
    io_service_.post(boost::bind(&m_client::write_buf, this,
                                 pMsgCopy, nMsgLen));
}

void write_buf(unsigned char *pMsg, unsigned short nMsgLen)
{
    // Achtung! Don't forget to free memory in complection callback.
    boost::asio::async_write(target,
                             boost::asio::buffer(pMsg, nMsgLen),
                             boost::bind(&m_client::write_buf_compl,
                                         this,
                                         boost::asio::placeholders::error));
}

void write_buf_compl(...)
{
    free(pMsg);
}

効率に夢中ならwrite()、最初に呼び出し元に動的に割り当てられたバッファーを提供させることでコピーを回避できます。しかし、実際にパフォーマンスに夢中なら、Boost.ASIO を使用しないことをお勧めします。しかし、それは別の話です。

于 2012-12-10T18:14:05.600 に答える