Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测.NET线程是否正在运行_.net_Multithreading_C++ Cli_Clr - Fatal编程技术网

检测.NET线程是否正在运行

检测.NET线程是否正在运行,.net,multithreading,c++-cli,clr,.net,Multithreading,C++ Cli,Clr,我使用C++/CLI,创建了两个线程 loadedThreads = gcnew array<Thread^>(2); len = 2; Thread^ th1 = gcnew Thread(gcnew ThreadStart(&Ping)); loadedThreads[0] = th1; Thread^ th2 = gcnew Thread(gcnew ThreadStart(&Ping)); loadedThreads[1] = th2; th1->S

我使用C++/CLI,创建了两个线程

loadedThreads = gcnew array<Thread^>(2);
len = 2;

Thread^ th1 = gcnew Thread(gcnew ThreadStart(&Ping)); loadedThreads[0] = th1;
Thread^ th2 = gcnew Thread(gcnew ThreadStart(&Ping)); loadedThreads[1] = th2;

th1->Start();
th2->Start();

threadsCreated = true;
loadedThreads=gcnew数组(2);
len=2;
线程^th1=gcnew-Thread(gcnew-ThreadStart(&Ping));loadedThreads[0]=th1;
线程^th2=gcnew-Thread(gcnew-ThreadStart(&Ping));loadedThreads[1]=th2;
th1->Start();
th2->Start();
threadsCreated=true;
两个线程都在检查彼此是否处于活动状态:

void Ping()
{
    while(true)
    {
        if(!threadsCreated) { Thread::Sleep(25); continue; }

        for(int i = 0; i < len; i++)
        {
            Thread^ t = loadedThreads[i];

            if(!t->IsAlive())
            {
                _log("some thread is not running");
            }
        }

        Thread::Sleep(25);
    }
}
void Ping()
{
while(true)
{
如果(!threadsCreated){Thread::Sleep(25);continue;}
对于(int i=0;iIsAlive())
{
_日志(“某些线程未运行”);
}
}
线程::睡眠(25);
}
}
但是如果我用ProcessHacker终止线程,该线程将不再运行,但仍将标记为活动(IsAlive=true,ThreadState=Running)

是虫子吗?这是黑客使用的攻击过程吗?

是托管线程;在应用程序的上下文中进行管理。托管线程不仅仅是在操作系统中启动一个线程,它们还保持线程对象的状态,以便以更友好的方式管理线程

当你启动一个线程时,操作系统必须管理这个线程(不管它是来自.NET、Java还是C),外部程序(比如进程黑客)可以看到这些线程,就像外部程序可以看到系统上运行的进程一样。进程黑客和类似的可以终止线程的程序通常只获取OS线程ID并调用WinAPI函数,这实际上会杀死活动线程,而没有机会让任何其他用户代码在其上执行

对于托管线程,这意味着当您调用该方法时,
Thread
类将保留其创建的内部线程的状态(例如线程的ID、将线程状态设置为“running”、调用用户函数等),当Thread函数结束时,
Thread
类将清理并设置适当的标志(例如,对于正常终止,线程状态设置为“stopped”,如果被调用,线程状态设置为“aborted”)。对此,如果您从外部程序(如Process Hacker)杀死线程,则
线程
类代码没有机会执行清理代码,从而将标志重置为其有效值,也就是说,
线程
类仍然认为它拥有的线程是有效的。应该注意的是,在通过Process Hacker杀死Thread对象后对其进行操作很可能会导致崩溃或未定义的行为


还应该注意的是,没有太多的方法来检测线程是否在代码之外被强制终止。您可以在线程上加入或在线程代码中实现某种心跳,但这仍然不能保证(特别是如果您实现了任何类型的同步锁)。如果线程被终止,您可能知道的最多的情况是线程以某种方式结束,并且正如您所指出的,它可能会导致无效状态

因此,直接回答:

是虫子吗

不,这是上下文中的预期行为

这是黑客使用的攻击过程吗

不,根据我上面的回答,它很可能使用了
TerminateThread
功能,但这确实需要管理员权限


希望这能有所帮助。

CLR线程不仅仅是操作系统线程上的薄型包装。我不会写完整的答案,因为我在平板电脑上键入了这个,但我可以告诉您,当您阅读
IsAlive
属性时,会间接调用哪个。它维护一个状态变量。“还应该注意,没有太多方法可以检测线程是否在代码之外被强制终止”-线程句柄是可等待的(当线程终止时发出信号)当线程句柄发出信号时,您应该能够向要调用的线程池注册回调。我相信CLR保留在本机线程之间洗牌托管线程的权利(在这种情况下,这将变得不可靠)但是目前没有这样做。@BrianReichle,没错,一个人可以加入线程,当线程被终止时,你可以假设线程已经结束,但我更重要的意思是,如果你强行终止线程,你最多知道的是线程结束了,而不一定是因为线程的状态而终止或刚刚结束(以及任何相关代码)可能处于无效状态。