先说下我客户端的结构:接收线程:recv()主要是, 不停地接收数据,并copy到缓冲区buf处理线程:分析缓冲区buf中的数据我设计的缓冲大小是接收最大报文的5倍,比如说,收到服务端发送的最大报文长度是5120,我的缓冲区最大是25600。现在出现的问题是处理线程速度远远跟不上接收线程我现在想开起多个分析线程去处理接收到数据,大家有什么好的建议?或者有其他的思路,说来听听啊?!

解决方案 »

  1.   

    在算法无法优化的情况下多线程是个思路。关键的问题是多个处理线程怎么同步的问题吧?
    同步的时候可以用mutex或者event或者其它的东西。我的大致思路是:
    1,用一个函数专门用来给各个处理线程分配需要处理的数据。
    2,在给各个处理线程分配需要处理的数据时通过mutex或者其它信号量来同步。
      

  2.   

    我现在是打算用多个线程共同去处理接收到的数据,相互之间用信号量进行同步管理。还有winsock recv的时候应该也有自己本身的缓冲区上限吧?最大是多少啊?
      

  3.   


    是这个原因, 接收线程的工作频度我有考虑过,只是我太敢确定,如果我降低接收频率,而发送端发送的数据包会不会越积压越多,导致数据丢失!!winsock应该也有自己的接收缓冲上线吧?!
      

  4.   

    lz是担心处理线程太慢而导致数据都堆压在sock缓存中,怕数据丢失吗?把recv到得数据,插到队列中,处理线程从队列中读取数据。多线程处理队列中的包文,不过如果包文之间需要组装,或者相互有逻辑关系,那可能就比较复杂了。
    另外,如果处理线程要做的事情实在很多,那肯定跟不上接受数据的速度,又怕缓存满了丢失数据的话,我觉得不如把数据都保存到临时文件吧。硬盘的空间肯定是没有问题的,保存到临时文件中,再慢慢处理数据也不急。
      

  5.   


    我现在打算开启多个处理线程去处理,1个接收线程 多个处理线程,1对多总是可以搞定他的吧只是不知道开启几个合适?   2个?3个?还是5个?
    我看了一下 我大概1毫秒左右接收一个数据包,将数据包接手后直接copy设置到缓冲区里,
    处理线程要进行逻辑分析处理工作,具体需要多久还没测试,
      

  6.   

    不要在网络处理线程里做任何I/O及耗时操作,需要做I/O操作的全部投递出去给别的处理器处理!包不会处理不过来的,就算你开多个线程处理包也得一个个包来,不然乱序就很麻烦!
      

  7.   


    麻烦你说的详细点:我现在一个recv线程:只负责recv接收数据到一个公用缓冲区一个处理接收数据线程: 负责解析报文,对粘包进行处理和分析报文,执行的代码量是超过接收recv线程
      

  8.   

    你这种情况多开线程没有用。
    一般应用场合
    1、多线程,不缓冲
    2、单线程,设置缓冲区
    多线程加缓冲区如果你只做一个简单例程,应该没有这种应用情况,你想通过多线程来增加处理速度是徒劳的,多线程方法和缓冲区方法处理时间是基本上是一样的,多线程同时处理数据,单线程只是处理完了一个接着在处理另外一个。对一个任务的处理过程,处理的时间取决于任务本身,将任务分解为一个一个小任务处理和同时处理一个一个小任务最终完成任务的时间是一样的。你这种情况处理慢可能原因有两个,一是处理太慢,二是设计有漏洞(CPU可能一直处理无关紧要的东西,没有数据一直接收等情况),处理太慢可能是你的处理本身太过复杂已经超过系统所能处理的能力,也可能是你的处理没有优化。
      

  9.   


    为每个用户开一个独立线程,独立线程中有接收报文机制,不需要缓冲区(为自己定义的10个报文的缓冲区不算),但是这种机制效率不高。做法是把接收做成阻塞模式(可以直接做阻塞的SOCKET,可以轮询等待,可以select查询,阻塞接收的最简单)。这种情况如果出现客户端经常不稳定情况效率比较低。
    另外还有处理好线程退出问题,要是客户端中间断开或者死等待要设定时钟主动退出,总体上还是多线程处理复杂,没有单线程效率高。
      

  10.   

    忘了说了,上面说的是TCP情况(多线程,不缓冲),因为一般一个连接对应一个用户
    UDP情况基本都是单线程,设置缓冲区
    如果单个处理时间实在太长可以设置2个线程,把处理过程用个独立线程来处理,多个线程处理缓冲区队列完全没必要,否则设置2个线程都多余。
      

  11.   

    你可以用Intel TBB的Pipeline,它和你的思路一至。在Pipeline里加入三个"Filter",第一个是输入,指定为串行执行;第二个是处理,可以指定为并发执行;第三个输出。
    至于并发执行会使用多少个线程TBB会依据CPU型号帮你决定的
    http://www.cppprog.com/2009/0325/92_4.html