如何让libevent的线程优雅的退出

ken_scott 2013-09-26 10:30:05
下面是一个专门用来处理libevent的线程的代码 (不好描述啊...但我想大家应该懂得我说的)

sometype * obj = nullptr;
resource * res = nullptr;
do
{
obj = new sometype;
if (nullptr == obj)
{
break;
}

res = new resource;
if (nullptr == res)
{
break;
}

event_base_dispatch(base);
} while (false);

delete sometype;
delete resource;

我们知道程序会一直阻塞(不能叫阻塞,但暂且这么说吧)在event_base_dispatch(base);
windows调试时,在delete处断点,当程序退出时(我只知道关闭程序或者shift+F5来退出),但断点没跑过来
所以,我想程序是否有执行这一句?

其实,就是想问一个问题,如果让此线程优雅的退出

我想,可能要创建一个event(具体是什么事件没想出来),退出时,调用这个event的回调(回调中处理资源的释放问题),但退出时会触发一个什么事件呢,不清楚啊...
...全文
1114 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
仅就LZ的原问题而言,只有二楼是对的。 event_dispatch/event_base_dispatch的终止,需要你的程序主动触发,而不是响应什么事件了。 可调用:event_loopbreak/event_base_loopbreak或者event_loopexit/event_base_loopexit,建议使用后者。 实际上就是分别设置了libevent内置的两个标记量,这两个标记量都会使得dispatch方法中内置的循环退出, 之后就会执行调用dispatch方法的语句后面的内容了。 参考这篇文章: http://blog.csdn.net/yusiguyuan/article/details/18262151
  • 打赏
  • 举报
回复
引用 30 楼 zhao4zhong1 的回复:
想7×24小时稳定运行的程序 最好在运行过程中避免动态创建/销毁或申请/释放各种对象; 而应在初始化时先清理上次正常或异常退出导致的各种内部外部资源的占用,创建或申请足够使用的各种对象并将它们池化,然后进入主循环开始工作,工作中只改变池中各资源的使用/待用状态。
需要先实现内存池机制,而且建议只用于可以常驻或需要常驻的对象。 试想,如果所需的全部内存超大,又该如何?
赵4老师 2015-08-07
  • 打赏
  • 举报
回复
引用 44 楼 yulongying 的回复:
[quote=引用 40 楼 zhao4zhong1 的回复:] 建议帖主了解一下数据库系统是怎样实现事务的。
建议回答问题要到正题上去,别搞太虚的道理。[/quote] 挖坟可耻!
yulongying 2015-08-06
  • 打赏
  • 举报
回复
引用 40 楼 zhao4zhong1 的回复:
建议帖主了解一下数据库系统是怎样实现事务的。
建议回答问题要到正题上去,别搞太虚的道理。
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 14 楼 ken_scott 的回复:
[quote=引用 13 楼 max_min_ 的回复:] [quote=引用 11 楼 ken_scott 的回复:] [quote=引用 10 楼 max_min_ 的回复:] 本来就是一个线程的东西,怎么样算是达到了优雅的效果呢?
就像上面的代码,程序正常跑起来后,一定会内存泄漏的,因为后面的代码跑不到[/quote] 内存泄漏和 线程优雅退出没有关系吧! 一个是代码严重bug,一个是优化代码![/quote] 你看APUE、UNP的例子,很多都不释放内存了,因为他们觉得反正程序退出会回收内存 其实,也算内存泄漏吧[/quote] 其实那些例子,稍微改一下就可以释放内存了,也就是我所谓的优雅退出
baihacker 2013-09-26
  • 打赏
  • 举报
回复
看上去代码所在的线程应该是自己负责的没有人去控制,如果有控制的,可以把资源释放注册到控制者上面, 然后控制者去中止线程,然后做资源检测。如果没有控制的,可以注册到某个全局的东西上,比如某个对象的析构函数,不过这样的风险大,存在依赖问题。还或者不用动态分配的资源,直接用静态的。至于断电,海啸的,尽人事,听天命吧。
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 13 楼 max_min_ 的回复:
[quote=引用 11 楼 ken_scott 的回复:] [quote=引用 10 楼 max_min_ 的回复:] 本来就是一个线程的东西,怎么样算是达到了优雅的效果呢?
就像上面的代码,程序正常跑起来后,一定会内存泄漏的,因为后面的代码跑不到[/quote] 内存泄漏和 线程优雅退出没有关系吧! 一个是代码严重bug,一个是优化代码![/quote] 你看APUE、UNP的例子,很多都不释放内存了,因为他们觉得反正程序退出会回收内存 其实,也算内存泄漏吧
max_min_ 2013-09-26
  • 打赏
  • 举报
回复
引用 11 楼 ken_scott 的回复:
[quote=引用 10 楼 max_min_ 的回复:] 本来就是一个线程的东西,怎么样算是达到了优雅的效果呢?
就像上面的代码,程序正常跑起来后,一定会内存泄漏的,因为后面的代码跑不到[/quote] 内存泄漏和 线程优雅退出没有关系吧! 一个是代码严重bug,一个是优化代码!
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
我想让这个线程释放所有的资源再结束,而上面的代码其实还有很多东西跑不到
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 10 楼 max_min_ 的回复:
本来就是一个线程的东西,怎么样算是达到了优雅的效果呢?
就像上面的代码,程序正常跑起来后,一定会内存泄漏的,因为后面的代码跑不到
max_min_ 2013-09-26
  • 打赏
  • 举报
回复
本来就是一个线程的东西,怎么样算是达到了优雅的效果呢?
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 ken_scott 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
我就知道你会这么说... [/quote] 那你知不知道当你想让libevent的线程优雅地退出时,可能会停电、地震、海啸或者世界末日呢?[/quote] 尽人力听天命,这种小概率事件发生了,我也没办法啊
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
关于 event_loopbreak() 没看到具体应该怎么做,不过我想可能是在某个事件的回调函数中来调用它吧,但这个事件应该是个什么样的事件呢 (或者说,怎样能在程序退出时触发这个事件,然后调用event_loopbreak()来跳出loop,释放资源) ?
jiaoshiyao 2013-09-26
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 ken_scott 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
我就知道你会这么说... [/quote] 那你知不知道当你想让libevent的线程优雅地退出时,可能会停电、地震、海啸或者世界末日呢?[/quote] 额 造谣是会被抓的
赵4老师 2013-09-26
  • 打赏
  • 举报
回复
引用 5 楼 ken_scott 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
我就知道你会这么说... [/quote] 那你知不知道当你想让libevent的线程优雅地退出时,可能会停电、地震、海啸或者世界末日呢?
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
我就知道你会这么说...
赵4老师 2013-09-26
  • 打赏
  • 举报
回复
不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
ken_scott 2013-09-26
  • 打赏
  • 举报
回复
引用 2 楼 spirit008 的回复:
event_loopbreak
谢谢,我先看看怎么用
木头菇 2013-09-26
  • 打赏
  • 举报
回复
event_loopbreak
ken_scott 2013-09-26
  • 打赏
  • 举报
回复

delete obj;
delete res;
....
加载更多回复(27)

64,654

社区成员

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

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