线程资源释放有关问题!!!

joners 2002-06-04 10:52:50
VC SDK 下,用createthread()创建了一个线程.
我的问题:
1.当线程从上到下执行完毕后,线程中定义的变量等就被系统释放了呢?
还是要释放线程的句柄后其中的变量才被释放?
2.如果使用createthread()创建线程,该使用哪"两个"(我记得是两个)API函数才能完全释放线程资源?
以前看过,忘记啦.现在写程序要用到,请帮忙:)
...全文
518 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
joners 2002-06-09
  • 打赏
  • 举报
回复
结账
masterdog 2002-06-08
  • 打赏
  • 举报
回复
哦!因为这两天不在,所以没有及时看到你的回复,你的理解很对,其实很简单,不是吗?
masterdog 2002-06-08
  • 打赏
  • 举报
回复
CreateThread的确占用了资源,我给你的那个例子就说明这个问题的,如果你安装了BoundsChecker就会发现如果不调用CloseHandle会出现资源泄漏
joners 2002-06-07
  • 打赏
  • 举报
回复
up
joners 2002-06-07
  • 打赏
  • 举报
回复
iterator(螃蟹)你问的不错:
我的这个贴子的意思是,想问一下,如果使用例如下面的代码在一个主进程中创建子线程后,如下:
HANDLE hThread=CreateThread(...);
if(hThread==NULL)
MessageBox(NULL,"CREATE THREAD ERROR","SYS",0);

问题:当此子线程在主线程中执行结束后,hThread句柄资源要不要释放掉,用什么函数?
问题:还需释放其他的什么资源么?

:)

iterator 2002-06-07
  • 打赏
  • 举报
回复
有内存泄漏的是_beginthread函数。用CreateThread没问题。
你的问题应该是,如何确保主线程最后退出。纯粹是设计问题,如果你举出具体的应用实例,我想会更有帮助
joners 2002-06-07
  • 打赏
  • 举报
回复
怎么没人来
joners 2002-06-06
  • 打赏
  • 举报
回复
masterdog(掌门狗):

对你的代码,我的理解如下。
线程采用判断g_bRunFlag的方法来进行,如果不为2则WSAWaitForMultipleEvents等待1秒,超时后,循环继续进行,判断g_bRunFlag,继续执行WSAWaitForMultipleEvents;
直到g_bRunFlag为2时候,跳过while,return 退出。
这时候主程序的GetExitCodeThread(hThread,&dwExitCode),获得退出消息,退出其while循环,最后CloseHandle( hThread )释放资源!

对不对?
masterdog 2002-06-04
  • 打赏
  • 举报
回复
刚刚不就是这个意思吗,后写的那个函数确保会响应主线程退出之前设置的退出标志,最多1秒钟后线程函数退出循环呀!然后你在主线程中调用CloseHandle避免资源泄漏.
joners 2002-06-04
  • 打赏
  • 举报
回复
masterdog(掌门狗)你说的对,用WSAWaitForMultipleEvents()是会出现消息不响应的问题.

我想问的是运行结束的线程的资源怎么样才能,完全释放?

我下了,明天再来....
masterdog 2002-06-04
  • 打赏
  • 举报
回复
同样的函数:
DWORD urThreadFunc(LPVOID lpParameter)
{
//do sth.
...
while(g_bRunFlag != 2)//退出标志
int nReturnCode = ::WSAWaitForMultipleEvents(..,1000/*ur timeout value*/);

return 0;
}
其中g_bRunFlag是全局变量,定义退出标志,由主线程控制.
masterdog 2002-06-04
  • 打赏
  • 举报
回复
当然有可能了,如果线程函数如下设计:

DWORD urThreadFunc(LPVOID lpParameter)
{
//do sth.
...

int nReturnCode = ::WSAWaitForMultipleEvents(..,INFINITE);

}

恰好此时该来的事件永远不会发生,就会出问题.但是这与你的设计有关系.

}

joners 2002-06-04
  • 打赏
  • 举报
回复
masterdog(掌门狗)
你好,我看你的程序,采用了一个永久循环来监测是否线程推出,这样写会不会,导致系统的消息不响应啊,用线程的目的之一,就是想避免例如WHILE循环这样的程序导致系统消息不响应的问题,这样一来.....呵呵

pp_ipr()
你能给出具体释放线程资源的例子么?
terminatethread()函数强行终止一个线程,会有垃圾的,该怎么解决?

pp_ipr 2002-06-04
  • 打赏
  • 举报
回复
按照侯sir深入浅出mfc所说,一是线程函数执行完后,系统调用ExitThread进行善后处理(自己也可在程序里调用此函数结束自己),二是进程结束导致线程结束或者别的线程调用terminatethread终结掉他
masterdog 2002-06-04
  • 打赏
  • 举报
回复
线程函数和普通函数没有什么区别呀?如果线程函数退出了,函数体声明的局部变量不就被"释放"了吗!我想你是不是没有关闭句柄呢?

HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)urThreadFunc,NULL,(DWORD)0,NULL);

do
{
GetExitCodeThread(hThread,&dwExitCode);
}
while(dwExitCode);

CloseHandle( hThread ); //important
joners 2002-06-04
  • 打赏
  • 举报
回复
UP

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧