Asio多线程

线程安全

通常来说,同时使用不同对象是安全的,但是并行地使用同一个对象是不安全的。令人欣慰的是,Asio中形如io_service这样的类型,提供了对并行操作的强大支持,介于此,你可以安全地并行调用同一对象。

线程池

多线程在调用io_service::run()时,会建立一个线程池来支持完成事件回调的响应。这种方案同样适用于io_service::post()在通过线程池处理计算任务的时候。特别注意的是,所有线程在加入io_service()时是等效的,它们的调用时刻也是不确定的。

Internal Threads 内含线程

Asio库对于特定平台的实现,有时候会用到很多的内含线程来模拟异步行为。尽可能的来说,我们会对库使用者隐藏线程,具体来说:

  • 线程不直接调用用户代码。
  • 线程必须阻塞所有信号。

这条准则保证了内含线程的实现:

  • 异步的回调函数只会被io_service::run()调用。

继而,用户的职责就是在创建和管理线程的时候,需要为所有线程分发通知,这样做的理由如下:

  • 只使用io_service::run()创立的单线程,这样用户可以避免同步行为中的复杂处理。比如,用户可以创建一个扩展性极强的单线程服务器(表面上是这样的)。
  • 用户可能会需要在其他代码执行之前,线程启动之后的时间内初始化线程。比如,Microsoft's COM用户需要在其他同线程的COM操作之前调用CoInitializeEx。
  • 库的接口削弱了线程的创建和管理,而且允许某些不允许操作线程的平台调用异步行为。

参见

io_service

results matching ""

    No results matching ""