2013-02-20 169 views
3

当使用boost :: asio进行一些异步TCP通信时,我注意到它启动了很多(3-4)内部线程。在the documentation阅读,它说boost :: asio内部线程

"The implementation of this library for a particular platform may 
make use of one or more internal threads to emulate asynchronicity" 

现在我的lib有着严格的要求,以不启动任何额外的线程(除了由客户提供的,现在它也开始io_service::run()一个)。有没有什么办法可以停止boost :: asio来创建这些额外的线程?

另外,是否有任何其他的异步库,只能在一个线程中运行?

回答

5

您可以通过在相应的转换单位中定义BOOST_ASIO_DISABLE_THREADS来禁用仿真的异步操作支持。 The documentation有这样说的定义

Explicitly disables Boost.Asio's threading support, independent of whether or not Boost as a whole supports threads.

如果你没有找到platform specific implementation notes,它明确指出哪些操作使用该仿真。例如我几乎在每个平台上都知道async_resolve()是以这种方式模拟的,线程是在第一次调用async_resolve()时创建的。一些(所有?)Windows平台模拟其他几个操作,例如deadline_timer操作。

禁用线程支持的一种替代方法可能是避免这些模拟操作。我个人没有在项目中使用BOOST_ASIO_DISABLE_THREADS,所以我不确定它是否有其他副作用。

+2

当定义了'BOOST_ASIO_DISABLE_THREADS'时,Asio在尝试产生一个线程时抛出'boost :: asio :: error :: operation_not_supported'错误。因此,唯一的选择是避免线程产卵操作。在大多数实现中,这可以通过使用'resolve()'而不是'async_resolve()'来完成。在Windows上,定义'BOOST_ASIO_DISABLE_IOCP'将导致Asio使用基于选择的实现,该实现比较慢,但不应该产生额外的线程。 – 2013-02-20 16:01:00

+0

谢谢,实际上我根本没有找到这个文档。我将尝试使用DISABLE_IOCP – Rolle 2013-02-20 16:05:56

1

您是否真的测试过它,以查看线程是否在您的特定平台上生成?如果没有,问题解决!如果有的话,你可能会考虑像libevent或libev这样的不同的图书馆。无论是那些,还是由像Qt这样的各种库提供的一大堆其他异步事件循环都可以工作。

+0

是的,我看到他们产卵。此外,这个lib被移植到许多平台 – Rolle 2013-02-20 15:01:58