线程和Asio
线程安全
一般来说,并发使用不同对象是安全的,但并发使用同一对象是不安全的。然而,诸如is_service类型提供了安全并发使用同一个对象的强保证。
线程池
多线程可以调用io_service::run()设置调用完成处理程序的线程池。这个方法也可以被用于io_service::post()以用一种方式执行任何分配给一个线程池的计算任务。
需要注意的是所有加入is_service的池的线程被认为是平等的,并且io_service可以在它们之间以任意方式分发工作。
内部线程
特定平台的库实现可能使用了一个或更多的线程来模拟异步。这些线程必须尽可能的对库使用者不可见。特别的,线程:
一定不能直接调用用户代码;并且
必须阻塞所有信号。
这个方法实现由以下保证:
异步完成处理程序只会被当前正调用io_service::run()的线程调用。
因此,创建和管理所有要传递通知的线程是库使用者的责任。
这种方式的理由包括:
通过只从一个线程调用io_service::run(),用户代码能够避免结合同步开发的复杂性。例如,库使用者可以实现可伸缩的单线程服务(从用户的角度)。
库使用者可能需要在线程开始短暂的时间以后并且任何其他应用代码执行之前在线程中执行初始化。例如,微软的COM的使用者在任何其他COM操作能被线程调用之前必须调用CoInitializeEx。
库接口与线程创建和管理的接口是解耦的,并且允许在没有线程的平台上实现。