免费注册 查看新帖 |

Chinaunix

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

多线程epoll_wait后得到的活跃fd是线程安全的吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-11 15:47 |只看该作者 |倒序浏览

或者说多个线程在epoll_wait后,各个线程得到的epoll_event[]里的socket有相同的吗?



论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2012-04-11 16:10 |只看该作者
本帖最后由 yulihua49 于 2012-04-11 16:11 编辑
downmooner 发表于 2012-04-11 15:47
或者说多个线程在epoll_wait后,各个线程得到的epoll_event[]里的socket有相同的吗?

是线程安全的。

epoll不需要L/F模型,它已经是L/F的了。

论坛徽章:
0
3 [报告]
发表于 2012-04-11 16:17 |只看该作者
再问个问题, gdb 怎么让continue的程序 暂停下来

论坛徽章:
0
4 [报告]
发表于 2012-04-11 16:23 |只看该作者
:wink:

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2012-04-12 00:32 |只看该作者
yulihua49 发表于 2012-04-11 16:10
是线程安全的。

epoll不需要L/F模型,它已经是L/F的了。


有可能各个线程得到的epoll_event[]里的socket有相同的。特别在LT模式下

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2012-04-12 11:22 |只看该作者
本帖最后由 yulihua49 于 2012-04-12 11:24 编辑
chenzhanyiczy 发表于 2012-04-12 00:32
有可能各个线程得到的epoll_event[]里的socket有相同的。特别在LT模式下


不会。内置的L/F模式保证了这一点。
我们在大规模高强度并行服务测试中,使用了LT模式,充分验证了。

论坛徽章:
0
7 [报告]
发表于 2012-04-12 13:49 |只看该作者
本帖最后由 wwwsq 于 2012-04-12 13:50 编辑
yulihua49 发表于 2012-04-12 11:22
不会。内置的L/F模式保证了这一点。
我们在大规模高强度并行服务测试中,使用了LT模式,充分验证了。



fd_set里面比如有100个socket,其中五个有event。
第一个线程把那五个socket拿出去了。如果这个线程再检查一次,还会发现这五个socket有事件。这才是LT,事件没被处理掉,则每次检查都会报告有事件。

如果第二个线程也检查那100个socket,应该也会发现那五个socket有事件吧?因为fd_set并不知道这是另外一个线程。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
8 [报告]
发表于 2012-04-13 01:08 |只看该作者
yulihua49 发表于 2012-04-12 11:22
不会。内置的L/F模式保证了这一点。
我们在大规模高强度并行服务测试中,使用了LT模式,充分验证了。



会的。虽然内核使用了排他锁每次只唤醒一个epoll_wait()进程,但如果在LT模式下,而且唤醒的进程没有处理完该fd的全部数据,那么下一个epoll_wait()进程醒来的时候,就有可能得到该fd还是可读的,这样各个线程得到的epoll_event[]里的socket就有可能是相同的。
注意是:可能

其实这过程还是比较复杂,因为关系到进程调度、内核唤醒机制、锁等东西。

论坛徽章:
0
9 [报告]
发表于 2012-04-13 02:43 |只看该作者
回复 3# downmooner


    ctrl+c不行吗

论坛徽章:
0
10 [报告]
发表于 2012-04-13 14:43 |只看该作者
chenzhanyiczy 发表于 2012-04-13 01:08
会的。虽然内核使用了排他锁每次只唤醒一个epoll_wait()进程,但如果在LT模式下,而且唤醒的进程没有 ...



加上EPOLLONESHOT ,一个socket就只有一个thread处理,然后再epoll_ctl EPOLL_CTL_MOD修改该fd。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP