gpt4 book ai didi

c++ - asio::async_write 处理程序在 3 秒后被调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:52 25 4
gpt4 key购买 nike

多年来我一直在使用 boost::asio 套接字库。但是,我遇到了一个奇怪的问题。我有一个不断向另一个进程发送数据的类。它从队列中读取,并将其发送直到队列变空。为了简单起见,我已经从下面的示例中删除了所有这些细节。函数 socket_write 调用 asio::async_write,后者在完成时调用 writeHandler。我再次从处理程序中调用 socket_write 函数。这在低音量下完美无缺。

但是,在高音量下,事情变得很奇怪。起初,程序设法每秒执行 100 个 socket_write 操作周期。一分钟左右后,writeHandler 没有返回 3 秒。一旦它回来,另外 100 个周期在一秒钟内快速通过。然后 writeHandler 在 3 秒内没有返回。返回后,又进行了 100 次循环。

我晕了!什么可以让 writeHandler 每秒返回 100 次,然后延迟 3 秒,然后返回到每秒 100 次,然后延迟 3 秒?一旦开始,这是一个一致的模式。数据量不是太大,每次写入操作发送的不会超过几百个字节。我也在接收服务器上对读取操作进行了计时,读取时间永远不会超过几毫秒。延迟仅在写操作中。

class myclass
{
public:
// other stuff
void socket_write()
{
boost::asio::async_write(_socket,boost::asio::buffer(_writeVector),
boost::bind(&this_type::writeHandler, shared_from_this(),
pSession,boost::asio::placeholders::bytes_transferred,
boost::asio::placeholders::error));
}
void writeHandler(boost::shared_ptr<MessageSession> pSession, size_t bytesWritten, const boost::system::error_code& ec)
{
// stuff
socket_write(); // Call the socket_write function again.
}
};

最佳答案

想了想,决定看看是不是buffer limit的问题。所以我查看了发送缓冲区大小,它是 64K。所以我将其更改为 1MB。

    boost::asio::socket_base::send_buffer_size option(1048576);
_socket.set_option(option);

解决了!!!没有更多的延迟。

关于c++ - asio::async_write 处理程序在 3 秒后被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com