多线程收发数据的设计问题

96掌门师兄 2013-01-19 12:59:45
首先澄清一下,最近发了好几个帖子,有的标明了坐等结贴的,虽然还没有找到更好的满意答案,但是也可以结贴了,今天尝试结贴,好几次都失败,因为CSDN出了bug,结不了,望大家原谅,bug没有后立即结贴。

我打算用一个线程select侦听链路,另一个线程接收数据,当某个socket有数据可以接收的时候,立即pthread_cond_signal通知接收线程接收。
我接收的是每秒15帧左右的h264数据,每帧数据大小为80K左右,线程肯定是来得及收的,这样频繁的线程切换操作会影响性能吗?

发现了收了一段时间后pthread_cond_signal无法唤起线程中的pthread_cond_wait了(这时候线程已经收完数据空闲了),怎么会这样呢?

多线程接收客户端的数据服务程序,一般怎么设计比较好呢?
多谢了!
...全文
373 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
东北熊孩子 2013-02-22
  • 打赏
  • 举报
回复
其实好像没有那么麻烦的吧, 你只需要使用阻塞的方式去接收数据,将接收上来的数据放到一个缓冲区中,然后再从缓冲区中将数据取出来处理就好了 这样下来就三个线程,不管你有多少个客户端,不管你的数据量多大,都能很好的处理。 我觉得就是看你是怎么去设计的问题了。 祝你好运!!!
这不是鸭头 2013-02-05
  • 打赏
  • 举报
回复
监听的那个线程接收,在另一个线程分析
lincy0000 2013-02-05
  • 打赏
  • 举报
回复
mark下,直接用select接收数据是可以的,速度也很快,以前做过一个不断收发包的测试桩,用select模型,基本上数据很少丢失,另外可以把缓存设大点,setsockopt SO_RCVBUF
96掌门师兄 2013-02-04
  • 打赏
  • 举报
回复
引用 12 楼 morebread 的回复:
一共100个左右的客户端,那就可以考虑每个客户端单独使用一个线程进行处理 一个线程专门处理连接请求,一个线程专门处理数据,N个连接处理数据接收。这样就非常清楚了 推荐考虑boost的asio的异步模式,它采用回调方式应该也能处理你的当数据没接收完时又会有select消息通知的问题
多谢了。顶起来。
woshizz1j 2013-01-21
  • 打赏
  • 举报
回复
不可以直接用socket的IO模型么,最近在学习完成端口模型,感觉你这个可以用啊
无言猪 2013-01-21
  • 打赏
  • 举报
回复
请问你这个CS结构是怎么搭的,图像数据怎么是从C到S呢?
morebread 2013-01-21
  • 打赏
  • 举报
回复
一共100个左右的客户端,那就可以考虑每个客户端单独使用一个线程进行处理 一个线程专门处理连接请求,一个线程专门处理数据,N个连接处理数据接收。这样就非常清楚了 推荐考虑boost的asio的异步模式,它采用回调方式应该也能处理你的当数据没接收完时又会有select消息通知的问题
Squall_zy 2013-01-21
  • 打赏
  • 举报
回复
select不是这么玩的。
96掌门师兄 2013-01-20
  • 打赏
  • 举报
回复
顶起来,求帮助
西山小月 2013-01-20
  • 打赏
  • 举报
回复
可以这样。。。。
stjay 2013-01-20
  • 打赏
  • 举报
回复
linux下可用epoll
96掌门师兄 2013-01-19
  • 打赏
  • 举报
回复
引用 4 楼 hurryboylqs 的回复:
可以几个线程一起收 几个线程处理
恩,我是这样的,一个线程用select检测,可读的时候把socket信息传递给线程或线程池,然后去收,这时候传递数据的时候如何加锁有点混乱,还有就是如果select检测到缓冲区有数据可读,让线程池去收,结果线程池还没来得及收完,下一次select又来了,在没有数据到来的情况下,因为缓冲区的数据还没有收完,又会通知线程池收,这样就会重复收了,自己加了变量标示,但是感觉有点乱,不知道有没有好的模型。
hurryboylqs 2013-01-19
  • 打赏
  • 举报
回复
可以几个线程一起收 几个线程处理
96掌门师兄 2013-01-19
  • 打赏
  • 举报
回复
引用 1 楼 hezhe1008 的回复:
一直收就好了。。接收函数使用阻塞的模式,一个线程就可以吧
可能有100个左右的客户端,使用一个线程,如果一个客户端网络不好数据阻塞了(即便有超时2s机制),其他的都会延时,视频监控要考虑到延时
jimette 2013-01-19
  • 打赏
  • 举报
回复
顶一下!
呔妖怪来嘛 2013-01-19
  • 打赏
  • 举报
回复
一直收就好了。接收函数使用阻塞的模式,一个线程就可以吧

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧