用iocp时,是建立多个线程来处理接收的东西的。
我就想了,会不会发生下面的情况呢:
有好几个客户端向服务器发送了一定的数据,当服务器的工作线程对收到的数据进行处理时,会不会第一个线程取出了第一个客户端的数据和第二个客户端的一部分的数据,而第二个线程友把第二个客户端剩下的数据取走,这样两个线程对第二个客户端的数据就都不是完整的而出现错误凭空想象的,不知道会不会出现这种情况
如果会,该怎么防止呢

解决方案 »

  1.   

    第一个线程取走了第一个客户的信息进行处理,这个处理是需要时间的,所以第二个客户会被轮转到第二个线程,除非当前没有闲置的线程.当某一个线程取走了当前连接的内容之后,如果连接上没有第二个未决(还没有完成的)WSARecv(或者WSARecvFrom等),此时是不会收到数据的,所以你只需要保证同一个连接在同一时间只有一个未决的接收请求即可,这样子你的线程虽然可能只取到某一部分数据,但是可以把它缓存在连接的上下文当中,然后再提交接收请求,如此后续收到的先拼接到之前接收的数据后面,然后再从头分析,如果有多余一个完整报文的内容,可以继续缓存下来留待下次处理.
      

  2.   

    虽然WSARecv每次投递一个,你处理问之前不会返回第二个,但是还有send呢.所以对每个连接数据还是需要加锁,比如对每个连接资源释放,需要引用记数,所以还是需要加锁的.