如何查询在 Boost ASIO 中等待链的完成处理程序的数量?
How to query the number of completion handlers waiting on a strand in Boost ASIO?
是否有一种简单的方法来确定等待特定 Boost ASIO 链的完成处理程序的数量?我知道,这个数字在多线程环境中只会是近似值,因为它总是会发生,即完成处理程序在查询该计数器之后但在返回计数器之前在纳秒内完成。或者,同样地,其他线程可以 post 在查询计数器后立即对该链进行新工作。
不过这样一个大概的数字对我的申请来说已经足够了。
我明白,我可以在我的应用程序中添加一个 std::atomic<std::size_t>
变量,只要有东西被 posted 到 strand,它就会递增,并且每个完成处理程序都会递减,即在那条链中被处决。但是对于有时会被取消的计时器和有时会意外关闭的异步套接字混合在一起,我很担心,这种基于应用程序的计数器很容易失去同步。那么,有没有一种简单的方法可以“询问 ASIO 本身”,特定链上有多少工作在等待?
没有办法。请记住,链就像哈希桶:队列可以(并且将会)在不同链之间共享,超出合理数量的唯一链。
我认为对于执行器,我怀疑可以轻松地创建一个跟踪 on_work_started
/on_work_finished
调用的执行器。我没有这方面的例子,但我肯定我在图书馆看到过一个或多个 examples/tests。
是否有一种简单的方法来确定等待特定 Boost ASIO 链的完成处理程序的数量?我知道,这个数字在多线程环境中只会是近似值,因为它总是会发生,即完成处理程序在查询该计数器之后但在返回计数器之前在纳秒内完成。或者,同样地,其他线程可以 post 在查询计数器后立即对该链进行新工作。
不过这样一个大概的数字对我的申请来说已经足够了。
我明白,我可以在我的应用程序中添加一个 std::atomic<std::size_t>
变量,只要有东西被 posted 到 strand,它就会递增,并且每个完成处理程序都会递减,即在那条链中被处决。但是对于有时会被取消的计时器和有时会意外关闭的异步套接字混合在一起,我很担心,这种基于应用程序的计数器很容易失去同步。那么,有没有一种简单的方法可以“询问 ASIO 本身”,特定链上有多少工作在等待?
没有办法。请记住,链就像哈希桶:队列可以(并且将会)在不同链之间共享,超出合理数量的唯一链。
我认为对于执行器,我怀疑可以轻松地创建一个跟踪 on_work_started
/on_work_finished
调用的执行器。我没有这方面的例子,但我肯定我在图书馆看到过一个或多个 examples/tests。