【问题标题】:C++ Block thread exit signal/functionC++ 块线程退出信号/函数
【发布时间】:2014-02-09 16:53:13
【问题描述】:

我在线程中阻塞退出函数时遇到问题。

DWORD WINAPI thread1Func( LPVOID lpParam ) 
{

    exit(0); // Problem is there

    while(true){
        printf("runnging");
        Sleep(1000);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    int thread1 = 1;
    HANDLE thread1Handle = 0;

    thread1Handle = CreateThread( 0, 0, 
        thread1Func, &thread1, 0, NULL);  

    WaitForSingleObject(thread1Handle,0);

    system("pause");

    return 0;
}

不幸的是,我在 main 函数中创建的线程调用了 exit(0) 函数。

thread1Func 不直接调用 exit(0) 语句。它被thread1Func调用的函数调用。所以我不能评论或删除这个声明。

我想阻止线程的退出信号,我该怎么办?

如何阻止来自后台线程的退出信号?

【问题讨论】:

  • 你不能,afaik。你介意告诉我们这是什么类型的代码吗?我的意思是,你为什么不能只更改代码?

标签: multithreading winapi c++11 exit-code


【解决方案1】:

嗯,退出进程(至少在 windows 上)不是好方法,所以如果你喜欢 ERROR_SUCCESS (0),自然你应该在主函数中返回一个错误代码。

话虽如此,与您通常应该执行的操作相比,退出更像是强制退出,我只能假设它在后台调用 ExitProcess(0),您可以在 ExitProcess 的文档中阅读它它按照它说的做,立即退出进程而不发送信号或等待任何事情(比如挂起的操作),所以你最好的办法是利用 DLL 加载并创建一个假的 kernel32.dll 来阻止 exitprocess 或任何 exit()实际调用,或者在内存中执行整个操作,例如用 nop 填充退出调用,因此它什么也不做。

我只能假设您使用的是别人的代码,所以您不能将其注释掉,在这种情况下,您可以尝试一些调试帮助程序库,允许您使用诸如断点之类的调试器功能,然后直接跳过如果它不是来自主线程,则退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2021-03-11
    • 2018-11-26
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多