解决方案 »

  1.   

    tcp/ip协议栈里,本身就带了锁保护
    当你用几个线程同时使用send进行发送
    实际上只是对本地的socket发送缓冲进行带锁的写操作实现:
    CCriticalSection m_lock
    char * m_sndbuff;
    size_t i_buffsize;
    size_t i_buffremain;任何一个线程的send 调用
    实际都转换成
    m_lock.Lock( );
    if(datasize<=buffremain)
    {
    memcpy(m_sndbuff+i_buffsize-buffremain,pnewdata,datasize);
    m_lock.Unlock( );
    return datasize;
    }
    m_lock.Unlock( );
    return SOCKET_ERROR; //-1 or 0至于协议栈里的m_sndbuff
    它的发送次序你应用层是无法修改的,因此只要你的send成功
    那么次序就被确定了
    不会出现这个线程的send拷贝了一半数据然后被另一个线程中断,执行另一个线程的数据拷贝
    没有这种可能的,底层实现是带了锁保护的
      

  2.   

    那么按四楼的说法意思是说多线程下send是不用加锁了是吧
      

  3.   

    结论:
    无论tcp的协议栈内部有没有锁,和你说的多线程send是否乱序无关原因:
    上层多线程调用send时,自己都无法保证线程调度的先后顺序,又怎么能指望tcp的实现层能猜测到正确的顺序?事实上,不应该多线程进行并发的send
      

  4.   

    Yes,一般情况下,Send在一个线程,而不是分开到2个线程。
      

  5.   

    Yes,一般情况下,Send在一个线程,而不是分开到2个线程。恩,不过在完成端口的线程池模型中,往往send在不同线程内。但是不同线程的send不会同时发出