Visual Studio C++:创建这些线程的原因是什么?

Visual Studio C++: what's creating these threads?

我在 Unix 上使用线程已经 20 年了,只是在 Windows 上学习它们,Visual Studio 2008 年。

我的应用程序是基于对话框的 MFC GUI,有四个主要 "peer" windows(none 其中 "main" window)。当 MyApp::InitInstance() 启动时,Debug->Windows->Threads window 报告只有一个线程,MainThread。当我越过 first CDialog::Create() 调用时,创建了 3 个工作线程。我不知道这些是什么,也很想知道——尤其是想参考一本完整的解释书或网页。我尝试在 CreateThread() 上放置一个断点,但 VS2008 报告:The function cannot be found. 悬停在断点 window 中的 ! 图标上。如果我中断一个调用它的函数,我也不能单步进入它。我假设它是一个系统调用,因为内核代码 VS08 无法访问它。

然后我创建一个输出音频的工作线程并设置为 THREAD_PRIORITY_TIME_CRITICAL。这已经稳定运行了很长时间。

然而,一旦我的应用程序离开 MyApp::InitInstance(),就会有一个 神秘线程 使用 "Priority" 创建,在调试线程中显示为 -8 window。我不知道那个线程是什么。任何想法或资源指针?我尝试在 SetThreadPriority() 上放置一个断点,假设我会在任何代码中将其设置为这个非香草优先级,就像 CreateThread() 一样,它不是一个已知函数。

关于真正的问题,而不是纯粹的谜团:在关闭我的应用程序时,我正在破坏并释放我使用的所有内存,并在我这样做时在这个“-8”线程中崩溃所以。没有源代码,只有程序集,没有堆栈跟踪或符号。程序没有提示其堆损坏,例如出现在其堆栈或输出 window.

上的符号

我能想到的关于该应用程序的唯一额外信息是:

-- 它可以很好地接收 MIDI 事件并且已经存在多年

--它有一个工作线程,为一个声音缓冲区计算数据;我设置了一个哨兵布尔标志并等待它以 GetExitCodeThread() 结束;我确实得到了退出代码,所以我确定这不是 -8 线程。 (而且它的优先级是"TimeCritical",不是-8)

-- 除了内存泄漏外,一切都没有问题,我现在正在使用 _CRTDBG_MAP_ALLOC 解决这个问题。如果不释放数据,我就不会崩溃。但是在找出导致问题的确切对象之后,我仍然不知所措,因为——再一次——我实际上还没有创建一个引用该对象的线程。

许多库(包括 MFC)都会创建额外的工作线程或线程池作为其正常操作的一部分。没什么好担心的。

如果您真的想知道这些线程的确切创建位置,您在 CreateThread 上设置断点的问题是调试器无法解析符号名称。您需要通过使用特殊语法 {,,module}symbol(有关 here 的更多信息)告诉它它在哪个模块中来帮助它。此外,名称可能经过修饰,因此实际有效的符号名称可能是 {,,kernel32.dll}CreateThread{,,kernel32.dll}_CreateThread}{,,kernel32.dll}_CreateThread@44 中的任何一个。 SetThreadPriority().

同样

我还强烈建议将调试器配置为 use the Microsoft symbol servers,如果您还没有的话。这将为您提供更多有用的 Microsoft DLL(包括 MFC)中的函数地址符号,让您更好地了解它在做什么。

也就是说,知道线程的创建位置可能对您没有帮助。由于某处的缓冲区溢出,您很可能会发生某种堆损坏。当你释放一个已经溢出的缓冲区时,损坏会变得更糟,因为堆管理器将跟随损坏的指针并开始写入内存的其他随机位置;而不释放损坏的缓冲区不太可能使进程崩溃。准确追踪堆损坏发生的位置将具有挑战性。

感谢您帮助确定如何为线程创建设置断点。很明显它是在音频处理库中创建的。当一个人给了那个图书馆一块内存,其中包含要播放的样本,我已经释放了它是主要的候选人。

阅读 Microsoft 文档的字里行间,我发现了两个可能会关闭此类线程的附加函数(即 waveOutReset()waveOutClose()。调用这些函数后,访问冲突已消失了。对于这种类型的错误,很难确定,但对我来说,这似乎是问题的可能原因。

多年来,该程序只是根据用户命令退出,没有释放存储空间,也没有出现任何问题。只有在添加清理代码后问题才变得可见。这些事实也支持了怀疑的原因。