Thread Safety
一般来说,不同对象的并发使用是安全的,但单一对象的并发使用是不安全的。然而,像io_context这样的类型可以为并发使用单一对象提供强有力的保证。
Thread Pools
多个线程可以通过调用io_context::run()来设置一个线程池,可以在线程池中调用完成处理程序。这个方法也可以与post方法一起使用,作为跨线程池执行任意计算任务的一种方法。
.
注意所有被加入到io_context的线程池的线程都是等价的,io_context可以在所有线程之间以任意方式分配任务。
Internal Threads
对于特定平台的库实现可以使用一个或多个线程来模拟异步性。这些线程必须尽可能地对库用户不可见。尤其是,这些线程:
- 必须不直接调用库用户代码,
- 必须阻塞所有信号
以下保证补充了这个方法:
- 异步完成处理器只会被当前调用io_context::run()的线程调用。
因此,库用户的责任是创建并管理通知被递送到的所有线程。
采用这种方法的原因:
- 从一个线程调用io_context:run(),用户代码可以避免与同步相关的开发复杂性。例如,一个库用户可以实现可扩展的服务器,这个服务器只有一个线程(只是从用户视角看,只有一个线程,实际上不一定只有一个线程)。
- 库用户可能需要在线程启动后和其他应用代码被执行前,立即在线程中执行初始化。例如,Microsoft’s COM用户必须在其他COM操作被调用之前调用CoInitializeEx 。
- 这个库接口与线程创建和管理接口解耦合,并且允许在线程不可用的平台上实现。
See Also
io_context, post.