[关闭]
@john-lee 2021-01-01T17:00:08.000000Z 字数 842 阅读 691

线程和Boost.Asio(Threads and Boost.Asio)

Boost.Asio


线程安全

通常,并发使用不同的对象是安全的,但并发使用单个对象不安全。但是,诸如io_context之类的类型提供了更有力的保证,即并发使用单个对象是安全的。

线程池

多个线程可以调用io_context::run()来建立一个线程池,从中可以调用完成处理程序。这种方法也可以与post()一起使用,作为跨线程池执行任意计算任务的方法。

请注意,所有已加入io_context池的线程都被认为是等效的,并且io_context可能会以任意方式在它们之间分发工作。

内部线程

此库对于特定平台的实现可能使用一个或多个内部线程来模拟异步。这些线程必须尽可能对库用户不可见。特别是,线程:

  • 不得直接调用用户的代码;和
  • 必须阻塞所有信号。

这种方法辅之以以下保证:

  • 异步完成处理程序将仅从当前正在调用io_context::run()的线程调用。

因此,库用户有责任创建和管理将通知传递到的所有线程。

这种方法的原因包括:

  • 通过仅从单个线程调用io_context::run(),用户的代码可以避免与同步相关的开发复杂性。例如,库用户可以实现单线程(从用户的角度来看)的可扩展服务器。
  • 库用户可能需要在线程启动后不久以及执行任何其他应用程序代码之前在线程中执行初始化。例如,Microsoft COM的用户必须先调用CoInitializeEx,然后才能从该线程调用任何其他 COM 操作。
  • 库接口与线程创建和管理接口分离,并允许在线程不可用的平台上实现。
另请参阅

io_context,post.


Copyright © 2003-2020 Christopher M. Kohlhoff

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注