调用boost.asio的异步函数时,线程是什么时候创建的
When are threads created when calling async functions of boost.asio?
我对boost.asio库还很陌生,所以如果我理解错了这个库,请原谅我。我知道当异步函数被调用时,它们是在后台线程中运行的。我的问题是,后台线程是什么时候创建的?在调用异步函数之前还是何时调用?我之所以这么问,是因为我担心在调用异步操作时创建线程会产生不必要的开销(我知道开销在微秒级别,但这对我的应用程序很重要(。我做了相当彻底的搜索,现在仍然很清楚。asio似乎创建了自己的线程池来实现异步性,所以当调用异步函数时,线程池中的线程可能会被重用。有什么保证这总是真的吗?如果没有,我是否可以调整任何参数来强制线程池预分配,然后不再创建线程?谢谢
我知道当调用异步函数时,它们在后台线程中运行。
此可能作为调用异步调用的io_object的特定实现细节的一部分发生。这绝不能保证。如果对象能够在不创建线程或将工作放在线程队列上的情况下实现其目标,那么可以肯定它是以这种方式编写的。
我的问题是,后台线程是什么时候创建的?
Asio对象是句柄。它们遵从服务对象来执行它们的工作。服务对象创建一次,并在首次使用时附加到io_context。这很可能是创建任何线程或后台线程池的地方。这是一次性操作,因为io_service在io_context的生存期内保持活动状态。
在调用异步函数之前还是何时?
^^因此,在此之前。
我之所以这么问,是因为我担心在调用异步操作时创建线程会产生不必要的开销(我知道开销在微秒级别,但这对我的应用程序很重要(。
不关心
我做了相当彻底的搜索,现在仍然很清楚。似乎asio创建了自己的线程池来实现异步性,所以当调用异步函数时,线程池中的线程可能会被重用。有什么保证这总是真的吗?
这绝对是一个实现细节,并根据底层操作系统进行更改。
如果没有,是否有任何参数可以调整以强制线程池预分配,然后不再创建线程?
通常,您拥有的控制权是确定允许多少线程为io_context提供服务。可能有控制底层实现的方法,你必须检查asio的源代码/文档,看看它是如何在你的特定操作系统上创建异步环境的。
它可能会尽可能高效。我不会过分担心会创建太多线程,或者它们会经常被创建和销毁。
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 是什么导致了Unity 3D中的"错误线程异常"?
- 我的C++线程做错了什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 正在连接的等待条件变量的线程会发生什么情况?
- 线程和互斥锁的使用有什么问题
- 等待线程的最佳方式是什么
- 调用boost.asio的异步函数时,线程是什么时候创建的
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 什么时候标准::线程::连接会因no_such_process而失败
- 当两个线程同时尝试在同一静音上尝试try_lock()时会发生什么
- 什么时候使用互斥锁的吸气剂和二传手是线程安全的?
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 什么保证两个不相关的线程中的不同不相关对象没有(不可避免的)争用条件?
- gdb 中的线程 0x7fffc57fa700 (LWP 31671) 退出] 是什么意思?
- 如果我将作品张贴到线程池,并且线程已经在Boost中工作,会发生什么
- 创建线程时,我们什么时候必须使用LPTHREAD_START_ROUTINE
- 我什么时候需要一个无锁的数据结构来跨音频应用程序中的线程读取/写入数据
- 什么时候使用std::promise优于其他std::线程机制是一个好主意?