C++ 是否可以创建一个不使用';即使主线程在windows中使用c/c++;?
与上图一样,一旦主线程失效,所有其他线程将自动退出C++ 是否可以创建一个不使用';即使主线程在windows中使用c/c++;?,c++,windows,multithreading,C++,Windows,Multithreading,与上图一样,一旦主线程失效,所有其他线程将自动退出 有可能创建一个永不消亡的线程吗?如果main()小心地不调用ExitProcess()(或者在main返回时发生的任何调用),直到所有线程都终止,这是很容易做到的。在完成之前不要退出main。不太可能。CRT启动代码调用main(),然后调用exit()。它终止程序,而不考虑任何其他线程 您必须阻止main()返回。通常使用线程句柄上的WaitForSingleObject()完成 在这种特定情况下,如果在跟踪main的返回时看到线程仍在运行,
有可能创建一个永不消亡的线程吗?如果
main()
小心地不调用ExitProcess()
(或者在main
返回时发生的任何调用),直到所有线程都终止,这是很容易做到的。在完成之前不要退出main。不太可能。CRT启动代码调用main(),然后调用exit()。它终止程序,而不考虑任何其他线程
您必须阻止main()返回。通常使用线程句柄上的WaitForSingleObject()完成
在这种特定情况下,如果在跟踪main的返回时看到线程仍在运行,那么您忘记了释放/关闭正在使用的Win32资源。您可以通过调用ExitThread()
来结束main()
函数的线程,而无需从main()
返回。这将结束主线程,但是main()
之后的CRT关闭代码将不会执行,因此,ExitProcess()
将不会被调用,并且所有其他线程将继续运行
尽管在这种情况下,您必须注意正确结束所有其他线程。当至少有一个线程不是“后台”线程时,进程将不会终止。从其他答案中可以看出,这可能是不可能的。问题是你为什么要这样做?这样做会违背操作系统的预期设计 如果你看这个:
您将看到线程是在进程上下文中执行的,而光纤又是在线程上下文中操作的 通过违反这些前提,您可能会在未来的操作系统升级中遇到问题,并且您的代码将变得脆弱
为什么不生成另一个进程并将其保留在后台?通过这种方式,您可以根据需要终止原始流程,如果用户愿意,他们仍然可以终止衍生流程。您可以,但您可能不应该;这只会让人困惑。您正在积累大量尚未结案的问题。请注意。Win32的可能副本没有“后台”线程。这似乎是一个.NET的概念:尽管Win32确实有线程的“后台处理模式”,但这似乎是不相关的:+1表示
WaitForSingleObject
。尽管如此,他说的是几个线程,所以我只想提到还有一个WaitForMultipleObjects[Ex]
。在没有CRT清理的情况下结束主线程是一个非常糟糕的主意。我强烈鼓励OP遵循“正常完成”的建议,忽略那些失望的投票者。