调用boost.asio的异步函数时,线程是什么时候创建的



我对boost.asio库还很陌生,所以如果我理解错了这个库,请原谅我。我知道当异步函数被调用时,它们是在后台线程中运行的。我的问题是,后台线程是什么时候创建的?在调用异步函数之前还是何时调用?我之所以这么问,是因为我担心在调用异步操作时创建线程会产生不必要的开销(我知道开销在微秒级别,但这对我的应用程序很重要(。我做了相当彻底的搜索,现在仍然很清楚。asio似乎创建了自己的线程池来实现异步性,所以当调用异步函数时,线程池中的线程可能会被重用。有什么保证这总是真的吗?如果没有,我是否可以调整任何参数来强制线程池预分配,然后不再创建线程?谢谢

我知道当调用异步函数时,它们在后台线程中运行。

可能作为调用异步调用的io_object的特定实现细节的一部分发生。这绝不能保证。如果对象能够在不创建线程或将工作放在线程队列上的情况下实现其目标,那么可以肯定它是以这种方式编写的。

我的问题是,后台线程是什么时候创建的?

Asio对象是句柄。它们遵从服务对象来执行它们的工作。服务对象创建一次,并在首次使用时附加到io_context。这很可能是创建任何线程或后台线程池的地方。这是一次性操作,因为io_service在io_context的生存期内保持活动状态。

在调用异步函数之前还是何时?

^^因此,在此之前。

我之所以这么问,是因为我担心在调用异步操作时创建线程会产生不必要的开销(我知道开销在微秒级别,但这对我的应用程序很重要(。

不关心

我做了相当彻底的搜索,现在仍然很清楚。似乎asio创建了自己的线程池来实现异步性,所以当调用异步函数时,线程池中的线程可能会被重用。有什么保证这总是真的吗?

这绝对是一个实现细节,并根据底层操作系统进行更改。

如果没有,是否有任何参数可以调整以强制线程池预分配,然后不再创建线程?

通常,您拥有的控制权是确定允许多少线程为io_context提供服务。可能有控制底层实现的方法,你必须检查asio的源代码/文档,看看它是如何在你的特定操作系统上创建异步环境的。

它可能会尽可能高效。我不会过分担心会创建太多线程,或者它们会经常被创建和销毁。

最新更新