【问题标题】:boost.asio tcp sockets, Will asynchronous operations be ordered?boost.asio tcp sockets,异步操作会被排序吗?
【发布时间】:2009-12-06 02:03:35
【问题描述】:

如果我一个接一个地调用 boost::asio::async_write/async_read,数据会被排序吗?或者在我再次调用写/读之前我需要等待回调吗?

提前致谢!

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    数据不保证是有序的,如果你正在使用这些函数,你应该在再次写入之前等待回调。

    (关于async_write的讨论,也适用于async_read

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      相关资源
      最近更新 更多