当前位置:  技术问答>linux和unix

再次请教 unix 下 多线程(进程)中对同一个socket_id处理的问题。

    来源: 互联网  发布时间:2016-02-23

    本文导语:  前几天完成个进程,大体是这样的: socket客户端进程连上服务端后,创建两个线程,一个线程只负责发送(send)数据,另一个线程只负责接收(recv)数据。 这样没有问题,后来做了一下修改,在send 线程中有时也做 recv...

前几天完成个进程,大体是这样的:
socket客户端进程连上服务端后,创建两个线程,一个线程只负责发送(send)数据,另一个线程只负责接收(recv)数据。

这样没有问题,后来做了一下修改,在send 线程中有时也做 recv 的动作,也就是两个线程都会在一个socket_id 上 recv,这就有问题了,间或会有一个线程挂起僵死,只到超时后pthread_kill掉重建,有时候线程正常运行,但两个线程接收的数据是错位的,有时候也会工作正常。

我采用的是多路复用阻塞方式,也是当poll发现有数据到来时,就调用recv 去接收,而send和recv、poll都是不可重入的,也就是存在两个线程可能同时认为这个socket_id有数据到来了,再同时调用recv去接收数据,而导至接收数据的不完整,我想如果换成read/write去操作socket_id不知道是否可行,还没有试呢。

以上是我的描述,也不知道对不对,向朋友们请教,类似这样的问题该如何处理呢?多线程(进程)如何处理同一个socket_id呢?

另外:多个线程(进程)中的poll系统调用会不会都发现同一组FD可用了,然后都对这一组FD进程操作呢?想研究这一类问题看些什么书比较好呢?请大家帮忙。


|
建立2个 缓冲队列,

建立2个线程.

一个线程负责在 socket 上 select 进行收发数据.
从队列 1 中读取数据,并发送出去,
把接收到的数据放入队列 2 中,

线程2 冲 队列2 中读取数据, 处理完后,放到 队列 1 中,
注意 在队列里取数据的时候加锁.

|
多线程多进程操作同一个socket, 需要进行互斥操作的

对socket操作如同对文件进行操作

操作过程中可能导致cpu切换的

切换后可能另外的线程就去读些了

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 柔性数组问题再次请教:
  • 再次请教如何在ultra dev里连接数据库!
  • [请教] KDE 安装过程中非正常退出后,再次进入出现的问题。高分。
  • 再次请教一个for问题
  • 舒宝辉再次向你请教!
  • 初学者的提问:关于JDK1.1.8的使用再次请教。
  • 菜鸟再次请教:RADHAT9.0下 显卡ati radeon 9200 se驱动 的 安装(说什么您也要看一看)
  • 再次请教!
  • 进过一次WIN,再次进入LINUX就有问题
  • 高手帮帮忙!!! 在线等!!outlook的附件修改且保存后,再次打开发现是修改之前的原件
  • 程序异常之后需要等待x秒才可以再次启动监听端口?
  • Ubuntu 卸载后再次安装软件包出问题了
  • cron里配置的任务在每次cron再次调用前 会自动杀掉么?
  • 为什么我卸载一个模块后再次加载会不成功呢,dmesg里是 Unknown parameter `1'
  • 进过一次WIN,再次进入LINUX就有问题 iis7站长之家
  • qianyuting(钱),关于Java的问题的解答,来领分,再次感谢!!!
  • 再次提问。别老是不理我了
  • 菜鸟再次提问!!!
  • Linux8.0 修改字符集后,再次进系统,无图形界面问题。。。求救。。
  • 再次向万能的CSDN BBS求救:我的Linux内核升级之后网卡激活不了啊
  • 网络再次连上了!!!!!!!!
  • 再次发帖,懂libcurl的进
  • 如何才能再次进入linux?
  • 关于SUN考试券,再再次散分
  • 再次散分支持linux类别,前十名拿分
  • 再次求助,如何重绘,急
  • 急啊,怎样在一个jsp文件里保存connection,使得下一个网页不用再次打开数据库
  • SourceForge再次被封!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3