读者来信与解答 1

原创 2013年10月10日 12:19:12

读者来信用黑色,我的回答用蓝色。经过整理,接近对话体。


> 陈硕,你好,
>
> 阅读了你的书,很有收获。
> 但是没有在moduo的源代码里面找到实现线程模型11的例子。即one thread per loop + thread pool。
> 谢谢。

书第 173 页图 6-14 下面的第一段话,具体改动方法参考前一页的 diff。


> 谢谢。
>
> 另外TcpConnection和Channel的生命周期管理有点问题。
> TcpConnection如果已经被回收了,其包含的Channel也已经被回收了。而这个时候在Channel::handleEvent()里面检查tied_和tie_是危险的。因为其内存已经被回收了。
>
> 如果用户保证TcpConnection被回收之后,不会再用Channel的裸指针,则没有必要在TcpConnection::connectEstablished()中call tie().

TcpConnection 回收之前,会调用 connectDestroyed,其中调用 channel_->remove();,这样就不可能再会有 Channel::handleEvent() 被调用了。

tie() 的作用是防止 Channel::handleEvent() 运行期间其 owner 对象析构,导致 Channel 本身被销毁。


> > TcpConnection 回收之前,会调用 connectDestroyed,其中调用 channel_->remove();,这样就不可能再会有 Channel::handleEvent() 被调用了
> 这个时候会不会有race condition?假设现在有两个active channels,处理头一个的时候回收TcpConnection,而第二个channel刚好对应这个connection。

这时你没有办法强制销毁 TcpConnection,只能降低其引用计数,所以不会有问题。你可以写段代码试试。

> 另外底层的poller OS api是否保证unregister channel之后一定不会再有这个channel的事件,会清空内核的已经就绪的事件队列?

跟内核没关系,Poller class 在 unregister channel 之后就不可能调用其 handleEvent() 成员函数。

> 那EPollPoller::fillActiveChannels()的改一改,“assert(it != channels_.end());”不再适用了,而且每次都个event都要查一次map。效率会有问题。

assert() 只有在 debug build 才执行,不会影响效率。
再说每个 event 都要涉及 read/write 等系统调用,开销比“查一次 map”大得多,优化这里是无用功。

> 但这个assert()不是invalid了吗?你可能之前在unregister channel的时候已经从map里面remove掉了它。

这个 assert 是有效的,你再想想。


> > tie() 的作用是防止 Channel::handleEvent() 运行期间其 owner 对象析构,导致 Channel 本身被销毁。

> 这个也不太make sense。仍然有race conditon。在Channel::handleEvent()拥有guard锁定ownner之前,Channel::handleEvent()需要检查其tied_。

你再想想,tie 的作用是防止调用 handleEvent() 期间对象销毁(比如调用 closeCallback 期间),不是也不可能防止调用 handleEvent() 之前对象销毁。

> 恩,是的。整个TcpConnection, Channel, EventLoop都是一个thread里面run的。

我的原创,思考写作时间在1小时以上,希望读者有真正收获的博客

[今天注意到博客园信箱里有几封信, 其中一封是这个]     原来我的原创,思考写作时间在1小时以上,希望读者有真正收获的博客被认为是不符合要求, 从首页上移出了。 这让我在写这篇博客的时候看了表,...

“一个程序员的成长史”系列答读者问(1)

“一个程序员的成长史”系列答读者问(1)
  • zhouzxi
  • zhouzxi
  • 2016年11月23日 20:45
  • 3047

进程同步的经典问题1——读者写者问题(写者优先与公平竞争)

http://blog.csdn.net/cz_hyf/article/details/4443551 读者-写者问题 写者优先与公平竞争 多进程对共享资源互斥访问及进程同步的经典问题...

答读者问(1):有关如何选导师及研究生时间安排等问题

最近收到一位读者的邮件,觉得可能有很多读者都关注其中的问题。因此,特在博客上附上个人的看法。不当之处,还请各路大仙批评指正。          邮件的部分内容如下: 你好: …… 我总结了一下我的问题...
  • zhouzxi
  • zhouzxi
  • 2014年03月25日 20:05
  • 2506

短信(可来信拦截,发送)

  • 2015年11月08日 20:52
  • 29KB
  • 下载

搜狗输入法皮肤-春天的来信

  • 2011年04月14日 22:30
  • 181KB
  • 下载

《一个陌生女人的来信》--茨威格

我爱你,与你无关。书中美句:我始终为你而紧张,为你而颤抖;可是你对此毫无感觉,就像你口袋里装了怀表,你对它紧绷的发条没有感觉一样;这根发条在暗中耐心地为你数着你的钟点,计算着你的时间,以它听不见的心跳...

来信通\2013

  • 2013年09月06日 17:16
  • 2.84MB
  • 下载

【CEO来信】马云:员工表现不好,老板要先检讨

阿里巴巴董事局主席兼CEO马云(制图:中国企业家网) 编者按: 谈到创业,阿里巴巴董事局主席马云总有一套独特的“生意经”,在阿里巴巴网站社区里,他不断为创业者们“指点迷津”。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读者来信与解答 1
举报原因:
原因补充:

(最多只允许输入30个字)