线程与Boost.Asio

线程安全 通常,多个线程并发使用不同的对象是安全的,但并发使用单个对象则不安全。然而,像io_context这样的类型提供了更强的保证,确保安全地并发使用单个对象。

线程池 多个线程可以调用io_context::run()来设置一个线程池,从中可以调用完成处理程序。这种方法也可以与post()结合使用,以在线程池中执行任意计算任务。

请注意,所有加入io_context池的线程被视为等效,io_context可以以任意方式在它们之间分配工作。

内部线程 针对特定平台的库实现可能会使用一个或多个内部线程来模拟异步性。这些线程在尽可能的情况下必须对库用户不可见。具体而言,这些线程:

  • 不能直接调用用户代码;并且

  • 必须阻塞所有信号。

这种方法有以下保证:

异步完成处理程序只会从当前正在调用io_context::run()的线程中被调用。 因此,创建和管理所有将接收通知的线程的责任在于库用户。

采取这种方法的原因包括:

  • 通过仅从单个线程调用io_context::run(),用户代码可以避免与同步相关的开发复杂性。例如,库用户可以实现从用户的角度看是单线程的可扩展服务器。

  • 库用户可能需要在线程启动后不久的线程中执行初始化,并在执行任何其他应用程序代码之前。例如,Microsoft的COM用户必须在从该线程调用其他COM操作之前调用CoInitializeEx。

  • 库接口与线程创建和管理的接口解耦,并允许在没有线程可用的平台上进行实现。

See Also

io_context, post.

Last updated