【问题标题】:Is it possible to create a thread that doesn't exit even when main thread exits in windows using c/c++?是否可以创建一个即使在使用 c/c++ 的窗口中退出主线程时也不会退出的线程?
【发布时间】:2010-09-12 15:35:42
【问题描述】:

和上图一样,一旦主线程死掉,所有其他线程都会自动退出。

是否可以创建一个永不消亡的线程?

【问题讨论】:

标签: c++ windows multithreading


【解决方案1】:

你可以,但你可能不应该;它只会让人们感到困惑。 Here is a good explanation 这是如何与 Win32 和 CRT 一起工作的。

【讨论】:

    【解决方案2】:

    您可以通过调用ExitThread() 来结束main() 函数的线程而不从main() 返回。这将结束您的主线程,但不会执行 main() 之后的 CRT 关闭代码,因此不会调用 ExitProcess(),您的所有其他线程将继续存在。

    尽管在这种情况下,您必须注意正确结束所有其他线程。当至少有一个线程不是“后台”时,该进程不会终止。

    【讨论】:

    【解决方案3】:

    如果main() 小心不要调用ExitProcess()(或在main 返回时发生的任何调用),直到所有线程都终止,这很容易完成。在 main 完成之前不要退出。

    【讨论】:

      【解决方案4】:

      不是真的。 CRT 启动代码调用 main(),然后调用 exit()。这将终止程序,而不管任何其他线程。

      您必须阻止 main() 返回。通常使用线程句柄上的 WaitForSingleObject() 来完成。

      在这种特定情况下,如果您在跟踪 main 的返回时看到线程仍在运行,那么您忘记释放/关闭您正在使用的 Win32 资源。

      【讨论】:

      • +1 表示WaitForSingleObject。虽然,他说的是几个线程,所以我只提一下WaitForMultipleObjects[Ex]
      • 在没有 CRT 清理的情况下结束主线程是一个非常的坏主意。我强烈鼓励 OP 遵循“正常完成”的建议并忽略反对者。
      【解决方案5】:

      从其他答案中可以看出,这似乎是不可能的。问题是你为什么要这样做?通过这样做,您违背了操作系统的预期设计。

      如果你看到这个:http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx
      您将看到线程旨在在进程的上下文中执行,而纤程又旨在在线程的上下文中运行。

      如果违反这些前提,您最终可能会遇到未来操作系统升级的问题,并且您的代码会变得脆弱。

      为什么不生成另一个进程并将其保留在后台?这样您就可以根据需要终止原始进程,您的用户仍然可以根据需要终止生成的进程。

      【讨论】:

        猜你喜欢
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多