在 Windows 上使用带有 COM 线程单元的 c++11 <thread> - 提示、技巧、陷阱?

Using c++11 <thread> with COM threading apartments on Windows - hints, tips, pitfalls?

我正在开发一个 Windows 应用程序,它使用多个 USB 声音接口和 ASIO drivers。每个 driver 公开一个 in-process COM 服务器并且必须 运行 使用单线程单元。

我的计划是 运行 每个在它自己的 STA 中负责处理回调和控制设备,而繁重的工作是从多线程单元完成的,利用处理器内核可以提供的许多硬件线程,并使用线程和未来 headers 可以提供的任何内容来使代码易于管理。

我想知道的是标准 C++ multi-threading 实现(特别是 Visual Studio)是否能很好地满足 COM multi-threading 要求(我仍在研究 - 封送处理)公寓之间仍然是个谜)?或者我会通过设计某种框架来包装适当的 Windows 平台 API 调用来减少摩擦吗?

无论您是通过 std::thread_beginthreadex() 之类的框架调用创建线程,还是直接调用 Win32 CreateThread(),最终都会在同一个地方结束OS.

COM 是一个系统组件,线程也是。它们独立于任何特定的编译器,但它们确实依赖于 OS。因此,在线程中使用 COM 的情况下,每个线程都单独负责显式调用 CoInitialize/Ex() 以建立它要关联的单元,无论是 STA 还是 MTA。以及在不再需要 COM 时显式调用 CoUninitialize()

这可以在上述任何线程管理调用中同样完成。