免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1858 | 回复: 5
打印 上一主题 下一主题

[C++] LF的paper里的一处问题, 你们怎么看? [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-23 23:23 |只看该作者 |倒序浏览
本帖最后由 linux_c_py_php 于 2013-01-23 23:30 编辑
  1. class LF_Event_Handler : public Event_Handler {
  2. private:
  3. // This use of <Event_Handler> plays the
  4. // <ConcreteComponent> role in the Decorator
  5. // pattern, which is used to implement
  6. // the application-specific functionality.
  7. Event_Handler *concrete_event_handler_;
  8. // Instance of an <LF_Thread_Pool>.
  9. LF_Thread_Pool *thread_pool_;
  10. public:
  11. LF_Event_Handler (Event_Handler *eh,
  12. LF_Thread_Pool *tp)
  13. : concrete_event_handler_ (eh),
  14. thread_pool_ (tp) {}
  15. virtual int handle_event (HANDLE h, Event_Type et) {
  16. // Temporarily deactivate the handler in the
  17. // reactor to prevent race conditions.
  18. thread_pool_->deactivate_handle (h, et);
  19. // Promote a follower thread to become leader.
  20. thread_pool_->promote_new_leader ();
  21. // Dispatch application-specific event
  22. // processing code.
  23. concrete_event_handler_->handle_event (h, et);
  24. // Reactivate the handle in the reactor.
  25. thread_pool_->reactivate_handle (h, et);
  26. }
  27. };
复制代码
18页.

语境就是leader做I/O复用检测到某个fd的event, 然后先从fdset里去掉该fd, 然后让出leader, 然后handle_event处理这个fd发生的event, 最后reactivate_handle恢复这个fd的监听到fdset.

我注意到最后一步把fd重新加入fdset是无锁进行的, 此刻可能有另一个线程已经成为leader并处于epoll, 这样加入有可能吗?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-01-23 23:34 |只看该作者
或者说reactivate_handle内部又走了一个pipe+queue的事件到epoll用于异步恢复fd?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2013-01-23 23:56 来自手机 |只看该作者
在demultiplexer里加入新的event source一直是这些模型里最复杂的一个步骤。
为了安全和兼容性起见,一般会中断当前阻塞的demultiplexer,更新event source set,然后继续之前阻塞的等待操作。
Solaris里的event port好像是可以异步更新的,别的不太确定,epoll貌似是不可以,详情得查手册

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2013-01-24 00:02 |只看该作者
看样的确如此, 走个pipe事件绕回去好了, 也想不出什么别的路子了.

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
5 [报告]
发表于 2013-01-24 00:06 来自手机 |只看该作者
对啊,libevent神马的就是这么做的

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2013-01-24 00:08 来自手机 |只看该作者
反观Proactor模型就没有这个问题,它根本就不需要demultiplexer
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP