关于send是否会造成数据乱序的问题 多线程socket 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 tcp/ip协议栈里,本身就带了锁保护当你用几个线程同时使用send进行发送实际上只是对本地的socket发送缓冲进行带锁的写操作实现:CCriticalSection m_lockchar * 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拷贝了一半数据然后被另一个线程中断,执行另一个线程的数据拷贝没有这种可能的,底层实现是带了锁保护的 那么按四楼的说法意思是说多线程下send是不用加锁了是吧 结论:无论tcp的协议栈内部有没有锁,和你说的多线程send是否乱序无关原因:上层多线程调用send时,自己都无法保证线程调度的先后顺序,又怎么能指望tcp的实现层能猜测到正确的顺序?事实上,不应该多线程进行并发的send Yes,一般情况下,Send在一个线程,而不是分开到2个线程。 Yes,一般情况下,Send在一个线程,而不是分开到2个线程。恩,不过在完成端口的线程池模型中,往往send在不同线程内。但是不同线程的send不会同时发出 mysql使用问题 agc源码 winsock传送数据结构的问题? 请教一个driverwork的问题 为什么类不见了?(初学者) 我想做一个类似控件盒的东西,就是里面有一个一个控件,然后可以往视图里面拖控件,这个怎么做?给点思路? 我用boost转换格式的时候怎么出现这样的问题呢 如何把CString类型的数据赋值给LPTSTR类型的变量?? 高手请进:一个关于WriteFile的问题 如何实现MDI程序中,每一个子窗体的形式都不一样,高手请进 Visual Studio "14" 预览版发布 C++ 11/14特征 VC 初始化 代码应放哪里?
当你用几个线程同时使用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拷贝了一半数据然后被另一个线程中断,执行另一个线程的数据拷贝
没有这种可能的,底层实现是带了锁保护的
无论tcp的协议栈内部有没有锁,和你说的多线程send是否乱序无关原因:
上层多线程调用send时,自己都无法保证线程调度的先后顺序,又怎么能指望tcp的实现层能猜测到正确的顺序?事实上,不应该多线程进行并发的send