我对boost.asio库很陌生,所以如果我对库有错误的理解,请原谅我。 我了解调用异步函数时,它们将在后台线程中运行。我的问题是,何时创建后台线程?在调用异步函数之前还是何时? 我之所以这样问,是因为恐怕在调用异步操作时创建线程会产生不必要的开销(我知道开销是微秒级的,但这对我的应用程序很重要)。我进行了彻底的搜索,现在仍然很清楚。 似乎asio创建了自己的线程池来实现异步性,因此当调用异步函数时,线程池中的线程可能会被重用。是否可以保证始终如此?如果不是,是否有任何参数可以调整以强制线程池预分配,并且此后不再创建线程? 谢谢!
答案 0 :(得分:0)
我了解到,调用异步函数时,它们将在后台线程中运行。
此可能发生在io_object具体实现细节的一部分,您针对io_object调用了异步调用。绝不保证。如果该对象能够在不创建线程或将工作放在线程队列中的情况下实现其目标,则可以确定它是用这种方式编写的。
我的问题是,何时创建后台线程?
Asio io对象是句柄。他们遵照服务对象执行工作。服务对象创建一次,并在首次使用上附加到io_context。这很可能会创建任何线程或后台线程池。这是一次性操作,因为io_service在io_context的生存期内一直处于活动状态。
在调用异步函数之前还是当我调用异步函数?
^^因此,
之所以这样问,是因为恐怕在调用异步操作时创建线程会产生不必要的开销(我知道开销是微秒级的,但这对我的应用程序很重要)。
不用担心
我进行了彻底的搜索,现在仍然很清楚。似乎asio创建了自己的线程池来实现异步性,因此当调用异步函数时,线程池中的线程可能会被重用。是否可以保证始终如此?
这绝对是实现细节,并且会根据底层操作系统进行更改。
如果没有,我是否可以调整任何参数来强制线程池预分配,并且此后不再创建线程?
通常,您拥有的控制权在于确定允许多少个线程服务io_context。可能存在控制底层实现的方法,您必须检查asio的源代码/文档,以了解它如何在您的特定OS上创建异步环境。
它可能尽可能高效。我不会过分担心会创建太多线程,或者会经常创建和销毁它们。