免费注册 查看新帖 |

Chinaunix

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

各位大侠 :多线程与SOCKET问题,比较麻烦 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-12 19:19 |只看该作者 |倒序浏览
线程A中读block类型的socket,当read被阻塞时,此线程进入‘S’状态,阻塞可能由于对端异常关机或者网线断开造成,此时线程B中依靠heartbeat超时的消息去对A中所读的socket执行close操作,此操作可以唤醒A线程吗? 我这里的情况是已经对A中所读的socket执行了close(在B中执行close),但是A依旧处于睡眠状态,并没有被唤醒从而退出。
问题是,一个线程中关闭socket可以唤醒另外一个因为读这个socket而睡眠的线程吗?

论坛徽章:
0
2 [报告]
发表于 2007-09-12 19:39 |只看该作者
可以给A线程发个线程信号

论坛徽章:
0
3 [报告]
发表于 2007-09-12 20:02 |只看该作者
不知道。关注

论坛徽章:
0
4 [报告]
发表于 2007-09-12 20:09 |只看该作者
发信号是可以的,这个我试过了(发送SIGURG杀死这个线程也可以实现目的),但是我不明白的是为什么close操作没有唤醒另外一个线程中read操作呢? 按理说close以后,系统会使read立刻返回错误啊?奇怪了:)

论坛徽章:
0
5 [报告]
发表于 2007-09-12 22:56 |只看该作者
原帖由 lan_wjz 于 2007-9-12 20:09 发表
发信号是可以的,这个我试过了(发送SIGURG杀死这个线程也可以实现目的),但是我不明白的是为什么close操作没有唤醒另外一个线程中read操作呢? 按理说close以后,系统会使read立刻返回错误啊?奇怪了:)

B线程close的套接口描述符和A线程的有联系没?

论坛徽章:
0
6 [报告]
发表于 2007-09-13 09:03 |只看该作者
B线程close调的socket正是A线程中read的socket,由于对端断电(或者网线断掉),A线程处于read阻塞而睡眠的状态。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-09-13 09:33 |只看该作者
A线程可以用select来轮循..你也说过了..正常情况是不会阻塞太久的对吧..阻塞了肯定是网络出问题了.
这时候select 就会超时..你就把这个socket置为无效的就可以了..
线程B用来通过判断心跳来保活这个socket
两个线程可以不用通信..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP