有几个小问题请教下大家
1:主线程里开个子线程,现在假如主线程要退出了,但是子线程还在跑,这时候是否需要去关闭子线程?是直接让主线程退出还是waitforsingleobject(子线程)?我觉得可以不去关闭子线程,因为主线程是正常退出,进程也就结束了,进程所占有的所有资源都被OS回收,理论上也就无所谓的资源泄露。
2:如果要关闭子线程,常用的手法无非是用个全局变量或者信号量事件等去通知子线程,让其结束,那waiteforsingleobject一般等待多久合适?久了影响体验,短了可能线程还没结束。
3:还是上一个问题,假如子线程调用了一个第三方的DLL导出函数,这个函数一直没返回,这时候主线程要退出了,子线程要怎么退出呢?TerminateThread?waitforsingleobject肯定不合适,还是说不管了,直接让主线程退出。
如果碰到这些情况大家一般怎样处理?在线等。
1:主线程里开个子线程,现在假如主线程要退出了,但是子线程还在跑,这时候是否需要去关闭子线程?是直接让主线程退出还是waitforsingleobject(子线程)?我觉得可以不去关闭子线程,因为主线程是正常退出,进程也就结束了,进程所占有的所有资源都被OS回收,理论上也就无所谓的资源泄露。
2:如果要关闭子线程,常用的手法无非是用个全局变量或者信号量事件等去通知子线程,让其结束,那waiteforsingleobject一般等待多久合适?久了影响体验,短了可能线程还没结束。
3:还是上一个问题,假如子线程调用了一个第三方的DLL导出函数,这个函数一直没返回,这时候主线程要退出了,子线程要怎么退出呢?TerminateThread?waitforsingleobject肯定不合适,还是说不管了,直接让主线程退出。
如果碰到这些情况大家一般怎样处理?在线等。
不是硬件资源都可以不用管, 直接退出.
确切说, 只要是用句柄引用的资源和占用的物理内存, 系统都会帮忙回收.
其他的需要自行释放.2.
你可以把所有窗口都销毁了.
等子线程响应.
使程序似乎退出了,
只要不去看任务管理器.3.
没好的办法.
或许你可以尝试用 SetThreadContext 这种非常规手段来更改线程的执行.
直接ExitProcess就可以了.
回6L:通知子线程退出,但是子线程调用某个函数,这个函数一直没返回,这种情况下怎么让其退出?一直等吗?前提是这个函数是第三方提供的。
回7L:请教下所谓的标志位是不是让子线程去检测某个变量,当发现变量改变时就让子线程return退出?这种办法也没用。另外“增加子线程强制退出的方法”具体有哪些?不会是exitthread,termiantethread这些吧
回8L:。大哥能否对我的提问指点下。
只要需要时候把他设为false不会算是暴力的
3、这个,你调用DLL中函数的过程是什么?能改改不?能改就在这里加flag
{
while( true )
{
char* p = new char[1024]; delete p;
}
}int _tmain(int argc, _TCHAR* argv[])
{ HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL); Sleep(1000); TerminateThread(h, 0);
h = NULL; char* p = new char[1024]; //这里会死锁,过不去 delete p; return 0;
}exitprocess================>terminatethread不稳定http://shfzhzhr.iteye.com/blog/1106983
另外:我在win32多线程上看到的,没听说过主线程异常退出, 子线程还在。进程还在的话。不知道谁给可以提供一个例子,试验一下,我觉得 拿书上的话来吓唬人,没意思。提供例子,验证才是正道!!
HANDLE m_OsisObj[2];
m_OsisObj[0]=log->m_hSemaphore;
m_OsisObj[1]=log->m_hExitEvent;
dRet=WaitForMultipleObjects(2,m_OsisObj,FALSE,INFINITE);