深度探索多线程机制
小弟,我这有个问题,就是多线程的实现方式的底层机制
我举一个问题
例如我开这样两个线程
Thread[] infoThread = new Thread[2];
//线程一
infoThread[0] = new Thread(new ThreadStart(SendInfoSocket));
//线程2
infoThread[1] = new Thread(new ThreadStart(SendInfoSocket));
}
useSocket--------
public void SendInfoSocket{
// 使用一个已经存在连接好的socket
// 发送一个信息
sendSocket();
// 接收一个从服务器回来的消息
receiveSocket();
}
main{
infoThread[0].start();
infoThrad[1].start();
}
//
假设
线程1:发送 T1 应该得到答复也是T1
线程2:发送 T2 因该得到答复也是T2
但是这里的接收会不会乱序???
------解决方案--------------------怎么都扯到网卡了,这是从物理层到应用层的问题,主要是应用层.我也忘记了,不同进程是肯定不会乱的,线程的还没考虑过.建议楼主看一下计算机网络的课本,应该就很清楚了.
另外,和cpu也一点关系都没有.
------解决方案--------------------现在问题的关键是,线程发出的TCP报文上的应用标记(暂且这么叫吧汗),是标记了应用程序信息还是线程信息(实际上是粒度问题),如果是线程信息那就没错了;汗...
------解决方案--------------------首先搞清楚,接受到消息都会把数据放在本地的buff内,自己也可以设置大小。。你的线程recv也只是读取buff上的数据,所以要做好同步控制。 服务器返回消息才不管你是哪个线程发来的,它只管把数据放在那个buff上。。。
这里的接收会不会乱序 ? 那是肯定的,因为网络可能有延时,先发出的消息也不一定会比后发出的消息早到服务器。。。。。。。。。。
lz可以改用其他i/o模型,比如试试使用 select 模型。
如果非要 多线程,那么控制好你的recv函数,, 也可以在自己自己发送的数据上写入自己的线程id ,通过判断接受数据中的 数据来判断是否是该线程发送的。。。。 (效率不好)
------解决方案--------------------我说两句,虽然理论我不是很清楚,但是,我可以明确的告诉你,肯定会乱序,因为我也做了这样一个程序,当线程多了之后,顺序就乱了,我开始也觉得纳闷,感觉应该是一对一的,但实际上根本不是。这时从实践中总结出来的。