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

星耶 2014-01-16 03:40:25
问题是这样的,我创建了10多个线程共同完成一个相似的任务,并且每个线程中都有各自的动态空间分配。如果其中有一个线程完成了任务,那我就需要马上退出线程,同时终止其他所有线程,并且要释放它们相应的动态空间。
由于线程都涉及多循环,所以我不想通过互斥判断共享变量来实现,那样会极大降低效率。有没有其他什么办法能解决啊?
...全文
795 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)
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文详细阐述了微电网群的系统架构、数学建模过程、目标函数设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参数设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
内容概要:本文围绕多旋翼无人机姿态估计算法的开发与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源数据,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行数据与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研发或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开发高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文所述MATLAB/Simulink仿真模型与实测数据集进行复现与调试,重点关注EKF与UKF的数学推导、实现细节及关键参数调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。

65,211

社区成员

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

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