Skip to content

Conversation

feihongmeilian
Copy link
Contributor

No description provided.

@feihongmeilian
Copy link
Contributor Author

怎么单独起travis-ci? @zieckey

@zieckey
Copy link
Collaborator

zieckey commented May 17, 2018

这一段代码需要仔细推敲并进行周密的测试。现有项目中有很多单元测试就是为这个准备的。因为对象的生命周期很难管理。尤其是不知道上层应用如何调用的情况下。

@feihongmeilian
Copy link
Contributor Author

现在的解决方式是陈硕所说的弱回调技术,这方面不存在生命周期的问题,但是我起travis似乎有问题……

@feihongmeilian
Copy link
Contributor Author

feihongmeilian commented May 25, 2018

调整了下代码格式,前面肯定是travis的问题,你们可以测试一下你们认为的场景,在我这边我所想到的场景是修复了的 @zieckey

@feihongmeilian
Copy link
Contributor Author

这个问题回归到真实情况其实就应该是this+unique_ptr来实现,相关描述可以参见陈硕的<<linux多线程服务端编程>>P485, "如果Parent拥有Child,Child的生命周期由其Parent控制,Child的生命周期小于Parent”,其中的解决方式就是如此,而我这将Child的this替换成了weak_ptr,一定不会有生命周期的问题,同时又修复了我最开始描述的定时器没被删除的问题 @zieckey @shgxwxl

@zieckey
Copy link
Collaborator

zieckey commented Aug 7, 2018

这段代码,原来的实现有什么问题?请给一个例子看看。谢谢。

@feihongmeilian
Copy link
Contributor Author

feihongmeilian commented Aug 7, 2018

可以看前一个pr, #141

调用InvokeTimer::Start后Start的逻辑被放到了任务队列,如果这时立刻执行Cancel,Cancel将失效,定时器仍然执行。所以Cancel的真实逻辑也应该封装一个任务放入loop。

InvokeTimer::OnCanceled由EventWatcher::Cancel在cancel_callback_();里调用,而OnCanceled的调用会销毁EventWatcher对象,接着再设置cancel_callback_会导致内存访问错误

@feihongmeilian
Copy link
Contributor Author

我这边测试是没问题的,这个bug还是很明显的,也是必现的

@zieckey
Copy link
Collaborator

zieckey commented Oct 12, 2018

还是请 @shgxwxl 来跟进看看吧

@shgxwxl
Copy link
Contributor

shgxwxl commented Nov 29, 2018

@feihongmeilian 提交的分支在资源管理上更清晰一些,我merge了,你再帮忙也仔细看看 @zieckey

@shgxwxl shgxwxl merged commit 592372a into Qihoo360:master Nov 29, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants