免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ydfgic
打印 上一主题 下一主题

[C] epoll的几个操作函数是线程安全吗? 表示怀疑~ [复制链接]

论坛徽章:
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
21 [报告]
发表于 2011-08-31 14:03 |只看该作者
本帖最后由 yulihua49 于 2011-08-31 14:06 编辑
另外可以考虑用一个线程监听并压入任务队列,dreamyseason 发表于 2011-08-31 12:45



    原来是。但性能低,中间要切换一次线程。后来改的现在这个样子,程序简单了,效率还提高了不少。
一个人发任务,不如大家抢任务,谁抢到是谁的。

论坛徽章:
0
22 [报告]
发表于 2011-09-01 10:13 |只看该作者
又想到一个问题,貌似直到压队列后都没有执行recv读取操作,数据积压在内核缓冲里,网络繁忙时可能造成客户端发送失败,如果将把取的数据压入队列对客户端更友好些,读取只是一次内存拷贝(好像epoll无法关闭内核缓冲,因为在wait前无法向内核提供自己的缓冲区)应该很快。

论坛徽章:
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
23 [报告]
发表于 2011-09-01 11:36 |只看该作者
本帖最后由 yulihua49 于 2011-09-01 11:41 编辑
又想到一个问题,貌似直到压队列后都没有执行recv读取操作,数据积压在内核缓冲里,网络繁忙时可能造成客户 ...
dreamyseason 发表于 2011-09-01 10:13



    在do_work()里处理,读或写。
所有的所有,都在do_work()里处理。
所有的数据,fd,events,callback,status。。。。。都在task里。其内容你可以自由定义。
task与events的关联,由do_epoll()处理。

论坛徽章:
0
24 [报告]
发表于 2012-05-15 17:27 |只看该作者
回复 23# yulihua49


    你好,我目前的网络库,感觉效率还是不算很高,对于accept的处理,就如前面的朋友所言,单独一个线程,然后压入队列。多线程去获取。然后加入到自己线程内的epoll fd。

每个线程循环处理accept压入队列,epoll_wait。每个线程管理自己的fds。相互独立。

请问能把你的代码发送一份给我么?我想作为学习和参考,谢谢。

12f3210@163.com

论坛徽章:
0
25 [报告]
发表于 2012-05-15 21:42 |只看该作者
系统调用都是线程安全的!
常识!

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
26 [报告]
发表于 2012-05-15 22:40 |只看该作者
回复 25# JohnBull


    who say!

如何解析内核中有许多加锁操作?

论坛徽章:
0
27 [报告]
发表于 2012-05-15 22:43 |只看该作者
chenzhanyiczy 发表于 2012-05-15 22:40
回复 25# JohnBull


对呀!就是因为内核加过锁了!有什么可解释的?

论坛徽章:
0
28 [报告]
发表于 2012-05-15 22:48 |只看该作者
回复 26# chenzhanyiczy


而且说线程安全还是客气了的,应该说可重入

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
29 [报告]
发表于 2012-05-15 23:16 |只看该作者
回复 28# JohnBull


    我理解你的意思了。单从调用的角度出发,是线程安全。但从结果的角度来看,就不是了线程安全。

    比如:A 线程write("aaa")  -> 1.文件 ,同时B线程也write("bbb") -> 1.文件

那么最终的结果有可能是: aaa

从这结果看,就不是线程安全了

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
30 [报告]
发表于 2012-05-15 23:19 |只看该作者
回复 28# JohnBull


    可重入就更不对了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP