【问题标题】:Using c++11 <thread> with COM threading apartments on Windows - hints, tips, pitfalls?在 Windows 上使用带有 COM 线程单元的 c++11 <thread> - 提示、技巧、陷阱?
【发布时间】:2021-10-22 10:56:29
【问题描述】:
我正在开发一个使用多个 USB 声音接口和 ASIO 驱动程序的 Windows 应用程序。每个驱动程序都公开一个进程内 COM 服务器,并且必须使用单线程单元运行。
我的计划是在它自己的 STA 中运行每一个,负责处理回调和控制设备,而繁重的工作是从多线程单元完成的,它使用处理器内核可以提供的许多硬件线程,并使用任何线程并且将来的标头可以提供以使代码易于管理。
我想知道的是,标准 C++ 多线程实现(尤其是 Visual Studio)是否能很好地满足 COM 多线程要求(我仍在研究——公寓之间的编组仍然是个谜)?或者我是否会通过设计某种框架来包装适当的 Windows 平台 API 调用而减少摩擦?
【问题讨论】:
标签:
c++
multithreading
visual-studio
com
apartments
【解决方案1】:
无论您是通过std::thread 或_beginthreadex() 之类的框架调用创建线程,还是直接调用Win32 CreateThread(),最终都会在操作系统中的同一位置结束。
COM 是一个系统组件,线程也是。它们独立于任何特定的编译器,但它们确实依赖于操作系统。因此,在线程中使用 COM 的情况下,每个线程单独负责显式调用CoInitialize/Ex() 来确定要关联的单元,无论是 STA 还是 MTA。以及在不再需要 COM 时显式调用 CoUninitialize()。
这可以在上述任何线程管理调用中同样完成。