免费注册 查看新帖 |

Chinaunix

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

fd的瞬间状态变化问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-27 11:02 |只看该作者 |倒序浏览
问题是这样的:

是一个数据转发服务,线程1负责接入socket fd的读, 线程2负责fd的数据写,

现在出现问题的场景:

线程2准备对fd进行write写数据操作,切换到线程1

线程1发现socket fd读失败,调用close 直接关闭连接, 并回收该fd. 紧接着又有新用户接入,该fd又被重新使用,

这个时候切换到线程2, 这个时候回将错误的数据写到fd中。


目前想到了一种办法,但是只是把fd不立即回收,延时了一段时间。

哪个线程发现fd出错,先shutdown, 设置fd关闭连接标志,在线程1中对所有fd进行遍历,发现fd关闭连接标志再进行close操作。


不知道那个有什么好办法或者类似的处理经验??

多谢

[ 本帖最后由 unixpm 于 2008-5-27 11:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-27 11:30 |只看该作者
你看这样行不行,

线程1不要关闭fd
由线程2关闭
线程2关闭fd后,自己不要操作就是了

线程1只负责接收

论坛徽章:
0
3 [报告]
发表于 2008-05-27 11:32 |只看该作者
顺便猜测一下,你的业务逻辑没有分层???


参考一下中间件的思想,或许会有所得

论坛徽章:
0
4 [报告]
发表于 2008-05-27 11:44 |只看该作者

回复 #2 net_robber 的帖子

多谢您的答复。

程序中没有复杂的业务逻辑, 即使有, 已经做到了和数据转发的完全独立, 由另外一个线程完成的, 这个与问题无关

实际情况我简单说说吧

线程1负责多个fd的读数据操作,线程2负责从某种虚拟网卡中读取IP包, 然后根据目的IP地址,找到对应的fd, 进行写操作。

所以:
“线程1不要关闭fd
由线程2关闭
线程2关闭fd后,自己不要操作就是了

线程1只负责接收”

这个是用不上的,线程2没有办法知道那个fd需要关闭,除非发送IP包的时候产生错误,而且IP包也不一定就有。

线程1就是负责数据接收的。

所以问题的关键就是: "多线程操作fd, 线程切换, fd关闭后又重新接入"

现在貌式只能将fd数据的读写全部放到一个线程中

论坛徽章:
0
5 [报告]
发表于 2008-05-27 13:23 |只看该作者
添加一个队列可以么??

线程1把数据放入队列
现成2从队列中取数据

论坛徽章:
0
6 [报告]
发表于 2008-05-27 14:17 |只看该作者
我觉得你的业务逻辑处理没有分清楚,为什么会出现写的时候也可读,或者反之的情况,是业务逻辑就要求这样还是自己的设计不合理?如果业务逻辑就要求这样的话,似乎只有加锁来处理了.

论坛徽章:
0
7 [报告]
发表于 2008-05-27 14:19 |只看该作者

回复 #5 net_robber 的帖子

呵呵,这里应该是线程2把回来的数据读取出来,然后放到队列中供线程1进行处理, 这样把每个fd数据的读和发都在线程1中执行。

我觉得这样不大好,

数据转发的目的是在单位时间内尽可能多的发送数据,把读和写都集中到一个线程中,明显不能利用tcp的全双工的特性。这样设计后,也是串行读取n个fd, 然后串行写入n个fd。

而且队列, 不管是使用系统的队列(数据量很大,估计性能成问题),还是自己构造(内存耗用,容易出错),都比较麻烦, 而且存在一个速度平衡的问题,问题也很多,

不知道除了队列,能够还有其他的法子?

论坛徽章:
0
8 [报告]
发表于 2008-05-27 14:25 |只看该作者

回复 #6 converse 的帖子

因为是一个数据转发的服务, 而且和远程服务器端没有连接,是通过Linux下的虚拟网卡完成数据的转发和接收(IP包),
所以必然会出现同时读写数据的可能!

当然一个线程其实也可以完成这样的功能, 为什么要搞2个线程这样做呢?

(1) 发挥Tcp的双工的特点
(2)    发挥多cpu, 多核的特点

论坛徽章:
0
9 [报告]
发表于 2008-05-27 15:04 |只看该作者
第一个线程已经读写完毕了,要第二个现成干什么呢???

似乎有点鸡肋

论坛徽章:
0
10 [报告]
发表于 2008-05-27 15:05 |只看该作者
可能关键还是不明白你的需求,所以比太方便给你出主意
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP