首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

万一进程的主线程结束这个进程就结束了吗

2013-06-25 
一旦进程的主线程结束这个进程就结束了吗?看到什么前台线程和后台线程的东西,说是如果这个进程下的线程都

一旦进程的主线程结束这个进程就结束了吗?
看到什么前台线程和后台线程的东西,说是如果这个进程下的线程都是前台线程的话,程序就要所有已启动的线程都运行完毕才会结束。 主线程
[解决办法]
主进程结束,程序就退出了。
[解决办法]
理论上主线程结束进程就退出了,自动释放为这个进程分配的所有资源。 但是我们写程序一般都会自己结束其它线程释放资源,不然可能会出现未知的错误。
[解决办法]
主线程退出,进程退出。
“前台线程”的那个说法没什么道理
[解决办法]
主线程创建了辅助线程, 就要有两种行为 1  亲自结束辅助线程的生命(CloseHandle),2 等待辅助线程自己结束。否则如果主线程意外终止,会导致辅助线程的资源泄露。为了防止这种情况,也可以在辅助线程中采用GetExitCodeThread时时检测主线程(或者这样说不确切,也可以是创建者线程)是否还健在,从而自行结束生命。代码:
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
//辅助线程
HANDLE hParent=(HANDLE)lpParam;
DWORD nCode;
do
{
if (!GetExitCodeThread (hParent,&nCode))
{
printf ("get exit code failed!\n");
printf ("error:%d\n",GetLastError ());
}
if (nCode!=STILL_ACTIVE)//父线程结束
{
cout<<"Thread2 find his father had exit,so it exit itself"<<endl;
return 1;
}
}
while (TRUE);
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
//创建者线程,给辅助线程传递自己的句柄,该句柄必须通过DuplicateHandle得到
HANDLE hParent=INVALID_HANDLE_VALUE;
if (!DuplicateHandle (GetCurrentProcess (),GetCurrentThread (),GetCurrentProcess (),&hParent,NULL,TRUE,DUPLICATE_SAME_ACCESS))
printf ("get parent handle failed!\n");

HANDLE hThread = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,(LPVOID)hParent,0,NULL);
if(hThread == 0)
{
DWORD error = GetLastError();
cout<<"Create thread2 failed,error number:"<<error<<endl;
system("pause");
return -1 ;
}
Sleep(4000);
CloseHandle(hThread);
return 0;
}
[解决办法]
主线程   就像树的根节点一样,当根都不在了,毛将附焉。至于资源释放问题,unix和windows下不同。
[解决办法]
http://blog.csdn.net/my3439955/article/details/8909641

热点排行