boost.asio tcp套接字,是否会对异步操作进行排序?

时间:2009-12-06 02:03:36

标签: c++ boost-asio

如果我正在彼此之后直接调用boost :: asio :: async_write / async_read,那么数据会被订购吗?或者,在我再次调用write / read之前,是否需要等待回调?

提前致谢!

1 个答案:

答案 0 :(得分:2)

不保证订购数据,如果您正在使用这些功能,则应在再次写入之前等待回调。

(根据 async_write 进行讨论,也适用于 async_read

因为 async_write 是根据对底层流的 async_write_some 函数的多次调用实现的,所以这些调用不是原子的。每次调用都会尝试将数据写入流,并有一个内部回调来处理部分操作,实际上等待完成,因为您可能会编写自己的代码。因此,如果您不等待完成,您可以很容易地得到混合数据。

您还需要考虑线程。如果多次在流上调用 async_x ,最终可能会在不同线程中的同一底层流上进行并发操作,从而导致未定义的行为。