日期:2014-05-20  浏览次数:20757 次

深度探索多线程机制

小弟,我这有个问题,就是多线程的实现方式的底层机制
我举一个问题
例如我开这样两个线程
    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 ,通过判断接受数据中的 数据来判断是否是该线程发送的。。。。 (效率不好)
------解决方案--------------------
我说两句,虽然理论我不是很清楚,但是,我可以明确的告诉你,肯定会乱序,因为我也做了这样一个程序,当线程多了之后,顺序就乱了,我开始也觉得纳闷,感觉应该是一对一的,但实际上根本不是。这时从实践中总结出来的。