主线程退出时,会第一去结束其他线程吗
主线程退出时,会首先去结束其他线程吗?
如果我在主线程里创建一个线程A,线程A需要调一个静态对象的成员函数,并且调用主窗口的几个成员函数;
这样子会有问题吗?
------解决方案--------------------
线程是被 os 统一调度的,让生成的子线程先结束是编程人员的责任,因为让哪一个线程先结束是操作系统不知道的,设想你在一个进程中生成了 3 个线程的情况。
------解决方案--------------------
这要看退出的方式,如果你调用ExitThread就不会结束其他的线程
------解决方案--------------------
Windows 系统没有主线程和子线程之分只是启动顺序不同而已,所谓的主线程只是因为它是第一个线程序而已,由它启动的其它线程的地位跟它是没有分别的,也即是说所谓的主线程结束后程序不一定需要结束。
------解决方案--------------------
其实根本没有所谓主线程,只不过是因为一开始的那个线程调用了CRT的入口函数,当CRT入口函数返回时,会调用系统,停止其他线程。
------解决方案--------------------
先结束线程,再结束主线程
方法有很多,wait,公共变量都可以
------解决方案--------------------
不会。 如果你不显示的结束其它线程, 主线程不会处理。 只能留到最后Windows替你收拾其它线程这些垃圾。
------解决方案--------------------
不会。。其他线程若引用了全局的对象,则会报错拉.
------解决方案--------------------
windows核心编程中有讲的,第69页:
“Windows Platform SDK文档声明,进程要等到所有线程终止运行之后才终止运行。就操作
系统而言,这种说法是对的。但是, C / C + +运行期对应用程序采用了不同的规则,通过调用
E x i t P r o c e s s,使得C / C + +运行期启动代码能够确保主线程从它的进入点函数返回时,进程便终止运行,而不管进程中是否还有其他线程在运行。不过,如果在进入点函数中调用E x i t T h r e a d,而不是调用E x t i P r o c e s s或者仅仅是返回,那么应用程序的主线程将停止运行,但是,如果进程中至少有一个线程还在运行,该进程将不会终止运行。”
我同意12楼的说法。可以写一个测试代码
------解决方案--------------------
如果我在主线程里创建一个线程A,线程A需要调一个静态对象的成员函数,并且调用主窗口的几个成员函数;
这样子会有问题吗?
------解决方案--------------------
线程是被 os 统一调度的,让生成的子线程先结束是编程人员的责任,因为让哪一个线程先结束是操作系统不知道的,设想你在一个进程中生成了 3 个线程的情况。
------解决方案--------------------
这要看退出的方式,如果你调用ExitThread就不会结束其他的线程
------解决方案--------------------
Windows 系统没有主线程和子线程之分只是启动顺序不同而已,所谓的主线程只是因为它是第一个线程序而已,由它启动的其它线程的地位跟它是没有分别的,也即是说所谓的主线程结束后程序不一定需要结束。
------解决方案--------------------
其实根本没有所谓主线程,只不过是因为一开始的那个线程调用了CRT的入口函数,当CRT入口函数返回时,会调用系统,停止其他线程。
------解决方案--------------------
先结束线程,再结束主线程
方法有很多,wait,公共变量都可以
------解决方案--------------------
不会。 如果你不显示的结束其它线程, 主线程不会处理。 只能留到最后Windows替你收拾其它线程这些垃圾。
------解决方案--------------------
不会。。其他线程若引用了全局的对象,则会报错拉.
------解决方案--------------------
windows核心编程中有讲的,第69页:
“Windows Platform SDK文档声明,进程要等到所有线程终止运行之后才终止运行。就操作
系统而言,这种说法是对的。但是, C / C + +运行期对应用程序采用了不同的规则,通过调用
E x i t P r o c e s s,使得C / C + +运行期启动代码能够确保主线程从它的进入点函数返回时,进程便终止运行,而不管进程中是否还有其他线程在运行。不过,如果在进入点函数中调用E x i t T h r e a d,而不是调用E x t i P r o c e s s或者仅仅是返回,那么应用程序的主线程将停止运行,但是,如果进程中至少有一个线程还在运行,该进程将不会终止运行。”
我同意12楼的说法。可以写一个测试代码
#include <process.h> /* _beginthread, _endthread */
#include <windows.h>
unsigned __stdcall _threadfun(void* pParam)
{
while(TRUE)
{
Sleep(10);
}
}
void main()
{
unsigned uThreaID;
_beginthreadex(NULL,0,_threadfun,NULL,NULL,&uThreaID);
//不调用ExitThread,主线程执行完成退出,crt会终止所有的线程,进程就得以退出
//如果调用了ExitThread退出主线程,crt不会终止其他的线程,虽然主线程退出了,进程仍然在
//ExitThread(1);
}
------解决方案--------------------