如何在Windows 10并行加载的情况下快速使单个Thred应用程序失败?

如何在Windows 10并行加载的情况下快速使单个Thred应用程序失败?,windows,process,windows-kernel,Windows,Process,Windows Kernel,编辑:下面是一些澄清 我有一个实用程序应用程序来生成(或重新生成)其他进程,设置控制台窗口及其标题和图标,并将标准句柄连接到类似文件的对象(文件、命名管道、套接字) 如果出现任何故障,此应用程序必须立即尽快终止 if ( !success ) ExitProcess( 1 ); “在ntdll.dll中支持Windows10并行库加载”会出现问题 As和该功能可防止快速故障 由于ntdll,在30秒内执行的程序将显示为挂起!TPPWorkerThread在进程终止前等待空闲超时 即使我

编辑:下面是一些澄清

我有一个实用程序应用程序来生成(或重新生成)其他进程,设置控制台窗口及其标题和图标,并将标准句柄连接到类似文件的对象(文件、命名管道、套接字)

如果出现任何故障,此应用程序必须立即尽快终止

if ( !success )
  ExitProcess( 1 );
“在ntdll.dll中支持Windows10并行库加载”会出现问题

As和该功能可防止快速故障

由于ntdll,在30秒内执行的程序将显示为挂起!TPPWorkerThread在进程终止前等待空闲超时

即使我在注册表中设置了MaxLoaderThreads,也会在调用时创建踏板池

我的问题是,如何在不等待加载线程、不直接调用和不修改目标机器上的注册表的情况下终止进程

我的想法是为wich调用设置一个替换项,如下所示(它似乎有效)


编辑一些澄清

假设以下程序:

#包括
#ifndef\u调试
#pragma注释(链接器,“/ENTRY:EntryPoint”)
#否则
#定义入口点主
#恩迪夫
#定义\u工作线程的数量\u 3
DWORD标准调用WorkerThreadProc(PVOID未使用)
{
对于(;;)
睡眠(1000);
}
void入口点()
{
对于(int ii=工作线程的数量;ii;--ii)
CloseHandle(CreateThread(NULL,0,WorkerThreadProc,NULL,0,NULL));
睡眠(10000);
//对于演示,不要调用ExitProcess。
//退出过程(0);
}
初始线程启动三个工作线程,等待10秒,然后退出。工人们正在无限期地工作。 如果未定义
\u DEBUG
,则在
main()
的末尾没有调用ExitProcess的CRT代码,并且该进程在WorkerThreadProc上以三个线程继续运行

这就是我观察到的情况。我的进程和/或衍生进程,其中运行三个线程,入口点位于
ntdll!Tp…

我的代码最终调用了
ExitProcess
(在用
TerminateProcess
替换
ExitProcess
之后,它工作了)

关键是,当程序必须退出时,它必须立即退出,与任何库或线程中的任何锁无关。也许这与并行加载有关,也许我的代码或生成的代码中存在死锁,这无关紧要。程序必须退出,进程必须发出信号

此程序的主要用例是在其他程序因任何原因退出时重新启动它们,就像在中配置
respawn
时一样

我的问题是,如何在不等待结果的情况下终止流程 加载器螺纹

像往常一样,只需调用ExitProcess。这个调用只是终止进程,当然不等待加载程序线程

在30秒内执行的程序将因故障而挂起 到ntdll!TPPWorkerThread在启动前等待空闲超时 进程终止

这是错误的或措词不当的。这与进程不调用
ExitProcess
而只是从入口点返回(或终止自线程)的情况有关

如果出现以下情况,则进程退出:

  • 调用(无错误)-无条件 使进程退出。没有任何用户模式清理
  • 打电话来。然而,因为这里存在用户模式 清理-在某些情况下它可能会死锁
  • 所有线程在进程中退出。您的报价与此完全相关 案例如果您的“单线程”应用程序只是从入口退出 无调用的点
    ExitProcess
    -只有在没有其他调用的情况下才能退出进程 进程中的线程。与并行加载程序存在的工作线程通常 如果没有任务,最多可活30秒。因此,进程将不会退出 马上。但30秒后。但是,这只是在 进程不调用
    ExitProcess
    direct
在您的情况下-进程(spawn7.exe):

  • 或者不调用退出进程(在这种情况下,它可以在30秒后退出)
  • 或者调用中的死锁
    ExitProcess
    -在这种情况下需要查看它 调用堆栈并调试它

我可以这么说吗

即使我调用
ExitProcess
(在线程 池(处于活动状态)进程仍然存在,有三个线程 从ntdll.dll,但没有我的入口点

这是
错误,不能更改。如果调用了ExitProcess,则首先终止进程中的所有线程,调用线程除外。甚至在此之前出现死锁(在主进程堆的调用
RtlLockHeap
中)。也将是:

  • 或者进程中仍然存在“入口点”线程
  • 或者进程中只有一个线程(同样是您的“入口点”线程)

如果“仍然有来自ntdll.dll的三个线程,但没有其他线程”-我可以肯定地说-
ExitProcess
没有调用(或挂接)

我现在无法重现,可能这取决于白天(或晚上)的时间

这种情况(退出后ntdll.dll!TpReleaseWork中的三个线程)不仅(有时)出现在我的程序“spawn(7.exe)”中,而且(有时)出现在我无法修改的其他(知名)应用程序(我可以在Process Explorer中看到)中。在“新”功能“windows10在ntdll.dll中加载并行库支持”中可能会出现奇怪的情况。也许我错过了最新消息,也许是什么

无论如何,我需要“快速失败”,因为我使用进程进行同步(WaitForSingleObject),我现在有两个助手功能

ExitProcessNow“杀死”我自己,WaitForProcessOrMainThread等待最近通过调用CreateProcess创建的目标进程(或其主线程)

VOID
__stdca
VOID WINAPI ExitProcessNow( UINT uExitCode )
{
  if ( TerminateProcess( GetCurrentProcess(),
                         uExitCode ) )
    ExitThread( uExitCode );
  else
    ExitProcess( uExitCode );
}