首先澄清一下,最近发了好几个帖子,有的标明了坐等结贴的,虽然还没有找到更好的满意答案,但是也可以结贴了,今天尝试结贴,好几次都失败,因为CSDN出了bug,结不了,望大家原谅,bug没有后立即结贴。我打算用一个线程select侦听链路,另一个线程接收数据,当某个socket有数据可以接收的时候,立即pthread_cond_signal通知接收线程接收。
我接收的是每秒15帧左右的h264数据,每帧数据大小为80K左右,线程肯定是来得及收的,这样频繁的线程切换操作会影响性能吗? 发现了收了一段时间后pthread_cond_signal无法唤起线程中的pthread_cond_wait了(这时候线程已经收完数据空闲了),怎么会这样呢?多线程接收客户端的数据服务程序,一般怎么设计比较好呢?
多谢了!

解决方案 »

  1.   

    本帖最后由 oyljerry 于 2013-01-20 17:38:49 编辑
      

  2.   


    恩,我是这样的,一个线程用select检测,可读的时候把socket信息传递给线程或线程池,然后去收,这时候传递数据的时候如何加锁有点混乱,还有就是如果select检测到缓冲区有数据可读,让线程池去收,结果线程池还没来得及收完,下一次select又来了,在没有数据到来的情况下,因为缓冲区的数据还没有收完,又会通知线程池收,这样就会重复收了,自己加了变量标示,但是感觉有点乱,不知道有没有好的模型。
      

  3.   

    请问你这个CS结构是怎么搭的,图像数据怎么是从C到S呢?
      

  4.   

    不可以直接用socket的IO模型么,最近在学习完成端口模型,感觉你这个可以用啊
      

  5.   

    一共100个左右的客户端,那就可以考虑每个客户端单独使用一个线程进行处理
    一个线程专门处理连接请求,一个线程专门处理数据,N个连接处理数据接收。这样就非常清楚了
    推荐考虑boost的asio的异步模式,它采用回调方式应该也能处理你的当数据没接收完时又会有select消息通知的问题
      

  6.   

    下,直接用select接收数据是可以的,速度也很快,以前做过一个不断收发包的测试桩,用select模型,基本上数据很少丢失,另外可以把缓存设大点,setsockopt SO_RCVBUF