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

星耶 2014-01-16 03:40:25
问题是这样的,我创建了10多个线程共同完成一个相似的任务,并且每个线程中都有各自的动态空间分配。如果其中有一个线程完成了任务,那我就需要马上退出线程,同时终止其他所有线程,并且要释放它们相应的动态空间。
由于线程都涉及多循环,所以我不想通过互斥判断共享变量来实现,那样会极大降低效率。有没有其他什么办法能解决啊?
...全文
656 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
星耶 2014-01-20
  • 打赏
  • 举报
回复
进程都退出了,当然动态new的空间也没有了。内存泄漏这种事只有那种需要长期跑的程序才需要担心。楼主你这种用完就退出整个程序的代码不用担心内存泄漏这回事。除非你在程序没退出前就把内存耗光了[/quote] 噢噢,原来如此啊~
星耶 2014-01-20
  • 打赏
  • 举报
回复
引用 38 楼 xyz378704 的回复:
根据楼主的描述,10个线程做的都是同一件事,那么请采用一个线程,线程间的切换也是有开销的,
上面已经说了,是一大件事中的小件事,分了工的……
modyaj 2014-01-17
  • 打赏
  • 举报
回复
不能把对内存的分配等操作封装成类吗。这样的话 对象结束时候会调用析构,析构函数里面处理好释放
赵4老师 2014-01-17
  • 打赏
  • 举报
回复
引用 37 楼 truexf 的回复:
补充,退出进程之前把hEvt和hSep closehandle一下
画蛇添足了。
xyz378704 2014-01-17
  • 打赏
  • 举报
回复
根据楼主的描述,10个线程做的都是同一件事,那么请采用一个线程,线程间的切换也是有开销的,
「已注销」 2014-01-17
  • 打赏
  • 举报
回复
补充,退出进程之前把hEvt和hSep closehandle一下
「已注销」 2014-01-17
  • 打赏
  • 举报
回复
创建一个事件,初始无信号, hEvt = createevent(NULL,...); 创建一个信号量 hSep = createsemaphore(...),初始信号值为0,每创建一个线程信号值增1,每停止一个线程信号值-1 各个线程循环的时候先waitformsingleobject一下这个事件hEvt,若有信号,则退出循环,释放内存,退出线程。 一个线程完成了任务setevent一下这个事件hEvt使其变为有信号,然后等待hSep直到他<=1,退出进程.
FancyMouse 2014-01-17
  • 打赏
  • 举报
回复
bFind不用加锁。输出答案倒是需要加锁。但是输出答案的锁肯定不会影响搜索的性能的。
赵4老师 2014-01-17
  • 打赏
  • 举报
回复
不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山! 进程退出时,操作系统会自动释放该进程申请的所有资源(包括内存、句柄、线程、USER对象、GDI对象、……;但不包括象磁盘空间这类资源) 参考《深入解析Windows操作系统-Windows Internals》进程管理
jiandingzhe 2014-01-17
  • 打赏
  • 举报
回复
你也可以这样干: 1:设置一个广播,某个线程在完成所有工作后,就发送广播到所有线程。 2:每个线程在干活之前,都先侦听一下那个信号。如果有,就说明有个线程已经干完了,那么就清理自己的内存然后返回。
xyz378704 2014-01-17
  • 打赏
  • 举报
回复
问题的关键是为什么要10个线程做同一个事,,,线程多了,切换开销也增大了,一个线程做足以
jiandingzhe 2014-01-17
  • 打赏
  • 举报
回复
引用 5 楼 dale999 的回复:
[quote=引用 4 楼 luciferisnotsatan 的回复:] lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。
是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存 [/quote] 你的任务划分十分奇特,能具体描述一下吗?也许不用这样。
WizardOz 2014-01-17
  • 打赏
  • 举报
回复
为什么老赵有这么多库存的代码?
assassin5616 2014-01-17
  • 打赏
  • 举报
回复
楼主是整个程序都要退出,担心什么清理内存的
引用 10 楼 dale999 的回复:
[quote=引用 9 楼 luciferisnotsatan 的回复:] [quote=引用 5 楼 dale999 的回复:] [quote=引用 4 楼 luciferisnotsatan 的回复:] lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。
是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存 [/quote] 另外,exit不是直接退出程序么?那就不能考虑清内存了,系统自动清。[/quote] 动态new的空间也自动清??[/quote] 进程都退出了,当然动态new的空间也没有了。内存泄漏这种事只有那种需要长期跑的程序才需要担心。楼主你这种用完就退出整个程序的代码不用担心内存泄漏这回事。除非你在程序没退出前就把内存耗光了
Jim_King_2000 2014-01-17
  • 打赏
  • 举报
回复
1. 不可以杀线程。必须实现线程的cancellation逻辑。 2. 每个线程对自己分配的资源有ownership。一般来说,谁分配的,谁释放。
lm_whales 2014-01-17
  • 打赏
  • 举报
回复
不使用内核对象,那就用锁定检测,锁定自增,自减,锁定加,减,这样的原子操作实现看。 Windows 就是 Interlock系列函数。
lm_whales 2014-01-17
  • 打赏
  • 举报
回复
可以多锁一起用。
南郊居士 2014-01-17
  • 打赏
  • 举报
回复
学习了,之前没有用过内存池
winginsky 2014-01-16
  • 打赏
  • 举报
回复
用一个bool变量做标记判断任务是否完成
luciferisnotsatan 2014-01-16
  • 打赏
  • 举报
回复
引用 26 楼 dale999 的回复:
[quote=引用 25 楼 luciferisnotsatan 的回复:] [quote=引用 23 楼 dale999 的回复:] [quote=引用 21 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 dale999 的回复:] [quote=引用 15 楼 luciferisnotsatan 的回复:] [quote=引用 11 楼 dale999 的回复:] [quote=引用 7 楼 luciferisnotsatan 的回复:] [quote=引用 5 楼 dale999 的回复:] [quote=引用 4 楼 luciferisnotsatan 的回复:] lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。
是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存 [/quote] 你的代码是干什么的? 一个线程完成后,其他线程的工作已经没意义。 10个线程都在做相同的事,看谁先做完?那你单线程不跑的更快? 10个线程互不相干,一个跑完后怎么能把其他9个干别的事的线程干掉? 10个互相协作一件事,一个线程跑完后,不代表其他线程都做完了,怎么能杀其他的?[/quote] 形象点儿说吧,我10个线程要找1到10亿中的一个数,只有一个满足要求,所以,我把10亿分成10个区段,让10个线程分别在不同区段找,哪一个找到了,当然就完成了,因为1到10亿中只有一个满足要求,所以就马上退出程序,其他线程再找是浪费资源了……[/quote] 最简单的方法就是设置个全局的 bFind = false。函数里设置一些检测这个bFind的检测点。一旦为true,就进入退出的流程(释放动态内存什么的)。那个线程找到了,就把bFind设置为ture,并进入退出流程。[/quote] 这就涉及共享内存吧?不需要互斥?[/quote] 全局变量,在一个进程里本来就是共享的。而且你这情况也不用互斥。因为只会是从false到true的改变。即使两个线程同时运行到 bFind = true的代码,也不会有任何问题。[/quote] 嗯,之前想过这种方法,但是觉得如果需要加锁,效率就不能接受了……我先试试这样会不会出问题……[/quote] 不会有问题。你的代码里出现同步问题,不会造成什么不良影响。 1 多个线程同时执行bFind = true,bFind多次被赋为true,结果还是ture,没什么问题。 2 A线程在运行if(bFind)时,B线程将bFind改为true。A线程这回没进if,下回进if。也没什么影响[/quote] 此法目前运行几次无误。话说是不是可以这样理解:多个线程单单对共享变量进行读,就可以不用互斥?[/quote] 只读不用加锁。 一个写,多个读,这个看具体情况。 多个写,基本上都要加锁。不过你的这个是特例,只有从false变为ture这么一个方式。
加载更多回复(27)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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