c++ - COM 函数产生不会消失的线程

标签 c++ c windows multithreading com

我正在开发一个小型应用程序,该应用程序旨在调用一些(非常不同的)功能,遗憾的是这些功能超出了我的控制范围,并且其设计方式使我不知道何时完成正确的用户操作。特别是其中一些会产生一个线程来完成它们的工作,该线程最终会在未来的某个时刻死亡。所以有些是同步实现的,有些是异步实现的,而我的代码不知道会是哪一个。

我的应用程序的唯一目的是启动这些任务并在完成后终止。由于目的是自动化,我预计它会在短时间内从批处理文件中调用数百次,因此我不希望该过程停留的时间超过绝对可能的时间。

由于我没有可以等待的信号,因此主线程上的 ExitThread() 似乎是可行的方法,因此外部代码生成的任何线程最终都会杀死该进程当它们终止时。

现在来谈谈标题中提到的我的实际问题。 :) 为了获得适合我的夹具的正确接口(interface),我需要使用一些 COM 函数。 SHParseDisplayNameIShellFolder::GetUIObjectOf 以及其他一些。但在我完成这些接口(interface)并释放它们之后很长一段时间,这些线程仍然存在。即使在我调用了 CoUninitialize() 之后。

使用 Process Explorer 检查我的进程时,大多数线程似乎都以 ntdll.dll@EtwTraceMessageVa 作为入口点,并且卡在 ntdll.dll!ZwAlpcSendWaitReceivePort+0xa 中。显然,使用 TerminateThread 随机终止线程在这里不是一个选项。

当我使用完 COM 后,如何才能终止这些线程?我正在使用 W7 x64 进行开发。

最佳答案

这些线程不属于 COM。它们属于 native Windows 线程池。它们被设计为可保留,以便在必要时可以重复使用。假设没有挂起的异步回调,您应该能够干净地关闭。线程池将负责及时销毁线程。

关于c++ - COM 函数产生不会消失的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161839/

相关文章:

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

c - 创建基本日历程序的逻辑错误

c - 列出对我的库的所有调用

c++ - SymGetModuleInfo64 返回空 GUID

windows - 如何使用自动热键将窗口停靠在左侧?

c++ - 在 C++ 中访问不同类中的类的成员

c++ - 如何修复检测到的堆损坏 : after Normal block

c++ - 一次 I/O 执行速度比一次读取一点慢

c - 算术运算的处理时间不成比例 [C]

windows - Windows 上的 Jenkins 偶尔会挂起 Git 操作