4

我不断地从带有async_read(). 但是,在某些事件中,我必须通过同一个套接字同步发送数据,并在除上述事件处理程序之外的事件处理程序中等待 ACK(也是同步async_read的)。我正在等待同步read()调用中的 ACK。(请不要说我不是在谈论async_read_someread_some)。

在后台挂起时read()调用同步是否可以?async_read()

是否有可能async_read()已经在其内部缓冲区中收到了一半消息,而我的同步read()将与下半部分一起返回?

我怎样才能优雅地取消/挂起async_read()(没有任何数据丢失),所以我可以read()同时安全地调用同步?

4

1 回答 1

4

你可能不会那样做。

来自 boost doc 的引用:

此操作通过对流的 async_read_some 函数的零次或多次调用来实现,称为组合操作。程序必须确保流不执行其他读取操作(例如 async_read、流的 async_read_some 函数或执行读取的任何其他组合操作),直到此操作完成。

由于plainboost::asio::read也是一个组合读取操作,这可能会调用UB。

为了优雅地停止您async_read可以调用cancel(*),但在混合异步和正常操作时应该考虑您的设计。我建议从async_read-callback 处理程序发送 ACK。

(*) 请注意,取消有一些缺点,如链接中所述。一种是例如`cancel 可能会被忽略。

于 2013-02-14T11:29:13.963 回答