boost::async_write 导致数据损坏

Posted

技术标签:

【中文标题】boost::async_write 导致数据损坏【英文标题】:boost::async_write causing data corrupted 【发布时间】:2013-08-22 05:17:11 【问题描述】:

我目前正在使用 boost::async_write 一次发送一次大型缓冲区(大约 50KB)。结果是我在服务器端每 20 个缓冲区中收到大约一个损坏的缓冲区。

我的代码是这样的。错误处理等细节省略:

bool socket_available = true;
const_buffer *buffer;

// will be called frequently in a while loop in thread A
void send_buffer()

    scope_lock l(mutex);
    if (!socket_available) return;

    socket_available = false;
    buffer = get_buffer_for_send();   // The size is about 50KB
    boost::asio::async_write(
        socket, buffer,
        boost::bind(handle_write_request, boost::asio::placeholders::error)
    );


// will be called in thread B which runs io_service::run
void handle_write_request(const boost::system::error_code& error_code)

    scope_lock l(mutex);
    socket_available = true;
    free_buffer(buffer);

我相信我正确使用了 async_write,因为我只在调用处理程序后调用了一次 async_write (http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html)。但是,数据在发送过程中似乎仍然交错。

我知道做这种事情的常用方法是将 async_write 放在处理程序中,这样它们就会在一个线程中被调用。当我这样做时,不会再次发生数据损坏。所以我只是想知道为什么上面的代码不能按预期工作。

感谢您的时间和建议。顺便说一句,我在 win 7 下使用 boost 1.54.0。

【问题讨论】:

套接字同步看起来很好,并且在我编写的模拟示例程序中正常工作。还有很多未知数(socket协议,其他线程中的socket使用情况,实际缓冲区);但是,如果您提供sscce,我们或许能够为您提供更好的帮助。 【参考方案1】:

由于您的发送是异步的,因此缓冲区必须在整个持续时间内保持不变。我不能从您的代码中这么说,例如,使用全局变量是不正确的。同时发送 2 次会发生什么?另外,get_buffer_for_send() 没有显示,它也可能包含问题。

【讨论】:

以上是关于boost::async_write 导致数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

boost::async_write 大文件和内存消耗

boost async_write() 和 non_blocking socket.send() 之间的区别

boost async_write:如果失败,如何跟踪未发送的内容并通知客户端/用户失败的内容?

核心数据“数据库出现损坏”——导致此错误的原因是啥?

如果我取消索引重组任务,是不是有可能导致数据库损坏?

文件系统损坏导致虚拟机无法正常启动的问题及解决方法