【发布时间】:2010-09-12 15:35:42
【问题描述】:
和上图一样,一旦主线程死掉,所有其他线程都会自动退出。
是否可以创建一个永不消亡的线程?
【问题讨论】:
-
您正在积累大量尚未解决的问题。请照顾好它。
标签: c++ windows multithreading
和上图一样,一旦主线程死掉,所有其他线程都会自动退出。
是否可以创建一个永不消亡的线程?
【问题讨论】:
标签: c++ windows multithreading
你可以,但你可能不应该;它只会让人们感到困惑。 Here is a good explanation 这是如何与 Win32 和 CRT 一起工作的。
【讨论】:
您可以通过调用ExitThread() 来结束main() 函数的线程而不从main() 返回。这将结束您的主线程,但不会执行 main() 之后的 CRT 关闭代码,因此不会调用 ExitProcess(),您的所有其他线程将继续存在。
尽管在这种情况下,您必须注意正确结束所有其他线程。当至少有一个线程不是“后台”时,该进程不会终止。
【讨论】:
如果main() 小心不要调用ExitProcess()(或在main 返回时发生的任何调用),直到所有线程都终止,这很容易完成。在 main 完成之前不要退出。
【讨论】:
不是真的。 CRT 启动代码调用 main(),然后调用 exit()。这将终止程序,而不管任何其他线程。
您必须阻止 main() 返回。通常使用线程句柄上的 WaitForSingleObject() 来完成。
在这种特定情况下,如果您在跟踪 main 的返回时看到线程仍在运行,那么您忘记释放/关闭您正在使用的 Win32 资源。
【讨论】:
WaitForSingleObject。虽然,他说的是几个线程,所以我只提一下WaitForMultipleObjects[Ex]。
从其他答案中可以看出,这似乎是不可能的。问题是你为什么要这样做?通过这样做,您违背了操作系统的预期设计。
如果你看到这个:http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx
您将看到线程旨在在进程的上下文中执行,而纤程又旨在在线程的上下文中运行。
如果违反这些前提,您最终可能会遇到未来操作系统升级的问题,并且您的代码会变得脆弱。
为什么不生成另一个进程并将其保留在后台?这样您就可以根据需要终止原始进程,您的用户仍然可以根据需要终止生成的进程。
【讨论】: