关于子线程被强制退出后的内存释放问题

subdivision 2013-07-30 02:30:13
示例如下:

void ThreadFunc ( void *PVOID )
{
....;
G(参数); //常规函数调用,是某工具库函数,内部代码不可见。此函数运行过程中消耗内存。
....;
_endthread();
}
void ThreadMemory ( void *PVOID)//此线程用于监视内存使用是否超阈值,比如>85%时,全局变量
memover=1
{
....;
_endthread();
}
int A()
{
HANDLE hMemory = _beginthread(ThreadMemory,0,NULL);
HANDLE hFunc = _beginthread(ThreadFunc,0,NULL);
while (1)
{
Sleep(10);
if ( memoryover )
{
if (hFunc)
{
while ( !TerminateThread(hFunc, 0) );
while ( !CloseHandle(hFunc) );
hFunc= NULL;
}
return 2;
}
}

main()
{
for 循环
{
A();
if A正常返回
     {...;}
if A由于内存超额返回2
     {......;}
}
}
/////////////////
现在问题就是,当第一次因为内存超出阈值强制终止线程ThreadFunc后,此线程消耗的内存资源并没有释放,从而会导致后续A函数的调用总是出现内存超阈值的情况。
由于ThreadFunc中使用的G函数是调用的外部工具库函数,所以在程序中不能使用delete释放内存。
这种情况下该怎么处理,使得第一次内存超阈值后,再次调用A时不会出现内存超阈值现象。

请帮忙给些建议,谢谢!
...全文
783 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-31
  • 打赏
  • 举报
回复
用多进程代替多线程。 《Unix编程艺术》
xiaohuh421 2013-07-31
  • 打赏
  • 举报
回复
引用 4 楼 subdivision 的回复:
[quote=引用 2 楼 xiaohuh421 的回复:] G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
这个G函数就是根据传入的数据进行一些计算,通常情况是可以正常结束,通过传出参数带回计算结果。但是,我希望当计算过程内存消耗过大时,停止计算,返回主函数后选择其它操作。[/quote] 注意, 我说的是"正常中断", 不是结束. 即函数在调用过程中, 可以通过一个参数,或者回调之类的中断计算过程. 如果可以, 则能让资源释放, 否则, 那是不大可能的. 还有, 我感觉你的函数计算第一次都会内存过大, 那么你中断了再重新算, 同样的条件下应该也还是会内存过大, 所以感觉你这样的操作应该是没用, 当然, 我不知道的你具体 应该哈.
subdivision 2013-07-31
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
[quote=引用 4 楼 subdivision 的回复:] [quote=引用 2 楼 xiaohuh421 的回复:] G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
这个G函数就是根据传入的数据进行一些计算,通常情况是可以正常结束,通过传出参数带回计算结果。但是,我希望当计算过程内存消耗过大时,停止计算,返回主函数后选择其它操作。[/quote] 注意, 我说的是"正常中断", 不是结束. 即函数在调用过程中, 可以通过一个参数,或者回调之类的中断计算过程. 如果可以, 则能让资源释放, 否则, 那是不大可能的. 还有, 我感觉你的函数计算第一次都会内存过大, 那么你中断了再重新算, 同样的条件下应该也还是会内存过大, 所以感觉你这样的操作应该是没用, 当然, 我不知道的你具体 应该哈.[/quote] 这个函数没有你所说的正常中断。 如果这个函数的计算过程内存消耗过大,那么退出子线程后会采用其他计算方法。 看来似乎只能使用多进程了。 谢谢回复。
subdivision 2013-07-30
  • 打赏
  • 举报
回复
引用 5 楼 ananluowei 的回复:
[quote=引用 4 楼 subdivision 的回复:] [quote=引用 2 楼 xiaohuh421 的回复:] G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
这个G函数就是根据传入的数据进行一些计算,通常情况是可以正常结束,通过传出参数带回计算结果。但是,我希望当计算过程内存消耗过大时,停止计算,返回主函数后选择其它操作。[/quote] 要么你把这个G函数放在另外一个进程中执行,这样检测内存消耗过大,就强行终止那个进程。资源能释放。 缺点是,进程间的通讯麻烦,要用共享内存或者管道啥的手段传递数据,不如同一进程之间不同线程通讯来的方便。 程序的复杂度也高了。[/quote] 是挺麻烦的。
大尾巴猫 2013-07-30
  • 打赏
  • 举报
回复
引用 4 楼 subdivision 的回复:
[quote=引用 2 楼 xiaohuh421 的回复:] G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
这个G函数就是根据传入的数据进行一些计算,通常情况是可以正常结束,通过传出参数带回计算结果。但是,我希望当计算过程内存消耗过大时,停止计算,返回主函数后选择其它操作。[/quote] 要么你把这个G函数放在另外一个进程中执行,这样检测内存消耗过大,就强行终止那个进程。资源能释放。 缺点是,进程间的通讯麻烦,要用共享内存或者管道啥的手段传递数据,不如同一进程之间不同线程通讯来的方便。 程序的复杂度也高了。
subdivision 2013-07-30
  • 打赏
  • 举报
回复
引用 2 楼 xiaohuh421 的回复:
G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
这个G函数就是根据传入的数据进行一些计算,通常情况是可以正常结束,通过传出参数带回计算结果。但是,我希望当计算过程内存消耗过大时,停止计算,返回主函数后选择其它操作。
subdivision 2013-07-30
  • 打赏
  • 举报
回复
引用 1 楼 ouyh12345 的回复:
做一个内存释放函数 当内存超出阈值时,暂停线程,调用内存释放函数
你所说的内存释放函数需要知道占用的内存空间地址吧? G函数内部不可知,我的程序只是调用它,它在运行期间占用的内存空间地址怎么获得呢?
xiaohuh421 2013-07-30
  • 打赏
  • 举报
回复
G函数可以正常中断吗? G函数是一个长期运行的函数, 如果线程被类似Terminate这类的函数结束, 那是不会释放内存的, 直到进程退出. 我想怎么让G函数正常中断其工作, 如果可以, 那应该可以正常释放内存的. 否则那可不容易了.
ouyh12345 2013-07-30
  • 打赏
  • 举报
回复
做一个内存释放函数 当内存超出阈值时,暂停线程,调用内存释放函数

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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