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

多线程中如何清理动态内存,求教各位大神

2014-01-22 
多线程中怎么清理动态内存,求教各位大神问题是这样的,我创建了10多个线程共同完成一个相似的任务,并且每个

多线程中怎么清理动态内存,求教各位大神
       问题是这样的,我创建了10多个线程共同完成一个相似的任务,并且每个线程中都有各自的动态空间分配。如果其中有一个线程完成了任务,那我就需要马上退出线程,同时终止其他所有线程,并且要释放它们相应的动态空间。
       由于线程都涉及多循环,所以我不想通过互斥判断共享变量来实现,那样会极大降低效率。有没有其他什么办法能解决啊?
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。

是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存 

你的代码是干什么的?
一个线程完成后,其他线程的工作已经没意义。
10个线程都在做相同的事,看谁先做完?那你单线程不跑的更快?
10个线程互不相干,一个跑完后怎么能把其他9个干别的事的线程干掉?
10个互相协作一件事,一个线程跑完后,不代表其他线程都做完了,怎么能杀其他的?

形象点儿说吧,我10个线程要找1到10亿中的一个数,只有一个满足要求,所以,我把10亿分成10个区段,让10个线程分别在不同区段找,哪一个找到了,当然就完成了,因为1到10亿中只有一个满足要求,所以就马上退出程序,其他线程再找是浪费资源了……

最简单的方法就是设置个全局的 bFind = false。函数里设置一些检测这个bFind的检测点。一旦为true,就进入退出的流程(释放动态内存什么的)。那个线程找到了,就把bFind设置为ture,并进入退出流程。

这就涉及共享内存吧?不需要互斥?

全局变量,在一个进程里本来就是共享的。而且你这情况也不用互斥。因为只会是从false到true的改变。即使两个线程同时运行到 bFind = true的代码,也不会有任何问题。

嗯,之前想过这种方法,但是觉得如果需要加锁,效率就不能接受了……我先试试这样会不会出问题……

不会有问题。你的代码里出现同步问题,不会造成什么不良影响。
1 多个线程同时执行bFind = true,bFind多次被赋为true,结果还是ture,没什么问题。
2 A线程在运行if(bFind)时,B线程将bFind改为true。A线程这回没进if,下回进if。也没什么影响
[解决办法]
不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!

进程退出时,操作系统会自动释放该进程申请的所有资源(包括内存、句柄、线程、USER对象、GDI对象、……;但不包括象磁盘空间这类资源)
参考《深入解析Windows操作系统-Windows Internals》进程管理
[解决办法]
楼主是整个程序都要退出,担心什么清理内存的

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。

是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存 

另外,exit不是直接退出程序么?那就不能考虑清内存了,系统自动清。

动态new的空间也自动清??


进程都退出了,当然动态new的空间也没有了。内存泄漏这种事只有那种需要长期跑的程序才需要担心。楼主你这种用完就退出整个程序的代码不用担心内存泄漏这回事。除非你在程序没退出前就把内存耗光了

热点排行