相关疑难解决方法(0)

为什么Windows 10会在我的程序中启动额外的线程?

使用Visual Studio 2015,在一个新的空C++项目中,为Console应用程序构建以下内容:

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在返回时设置断点并在调试器中启动程序.在Windows 7上,从断点开始,该程序只有一个线程.但在Windows 10上,它有五个(!)线程:主线程和四个"工作线程"等待同步对象.

谁在启动线程池(或者我如何找到)?

c++ windows multithreading threadpool

32
推荐指数
1
解决办法
6205
查看次数

为什么进程会在 RtlExitUserProcess/LdrpDrainWorkQueue 中挂起?

为了调试锁定的文件问题,我们从 .NET 进程调用 SysInternal 的 Handle64.exe 4.11(通过Process.Start异步输出重定向)。调用进程挂起,Process.WaitForExit因为 Handle64 进程没有退出(超过两个小时)。

我们转储了相应的 Handle64 进程,并在 Visual Studio 2017 调试器中检查了它。它显示两个线程(“主线程”和“ntdll.dll!TppWorkerThread”)。

主线程的调用栈:

ntdll.dll!NtWaitForSingleObject ()  Unknown
ntdll.dll!LdrpDrainWorkQueue()  Unknown
ntdll.dll!RtlExitUserProcess()  Unknown
kernel32.dll!ExitProcessImplementation  ()  Unknown
handle64.exe!000000014000664c() Unknown
handle64.exe!00000001400082a5() Unknown
kernel32.dll!BaseThreadInitThunk    ()  Unknown
ntdll.dll!RtlUserThreadStart    ()  Unknown
Run Code Online (Sandbox Code Playgroud)

工作线程的调用堆栈:

ntdll.dll!NtWaitForSingleObject()   Unknown
ntdll.dll!LdrpDrainWorkQueue()  Unknown
ntdll.dll!LdrpInitializeThread()    Unknown
ntdll.dll!_LdrpInitialize() Unknown
ntdll.dll!LdrInitializeThunk()  Unknown
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么进程会挂起LdrpDrainWorkQueue?从/sf/answers/2995277911/,我了解到这是正在工作的 Windows 10 并行加载器,但为什么它会在退出进程时卡住呢?这是否是由于我们从另一个进程调用 Handle64 的方式引起的?即,我们是否做错了什么,或者这是 Handle64 中的一个错误?

c++ windows multithreading process

5
推荐指数
1
解决办法
2769
查看次数

标签 统计

c++ ×2

multithreading ×2

windows ×2

process ×1

threadpool ×1