完成端口网络模型是否存在理论上的不稳定_怎么保证“投递次序恒等于完成次序”
完成端口网络模型是否存在理论上的不稳定__如何保证“投递次序恒等于完成次序”?
看了至少一个星期的完成端口资料,原理基本明白,但是有一个问题,一直找不到理论上的根据,所以在项目中,还是不敢用完成端口模型。
简单的说,如何保证“先启动的工作线程先执行完,后启动的线程后执行完”
对于TCP传输来说,客户端发送ABCDEFG给服务器,服务器可能会一下受到ABCD,也可以只收到AB,但是不管怎么,接收的字符的顺序肯定等于发送的顺序,这是不用怀疑的。
以服务器接收数据为例,对于一个SOCKET链接,他可能在一个时间是线程甲为他服务,一会是线程乙为他服务。先来的线程处理先到的数据。线程甲乙都是把收到的数据往该SOCKET连接对应的数据存储区中存储。假设线程甲取来了客户端发送来的ABC,线程乙取来了客户端发送的DEFG
现在的问题就是,
1、一个SOCKET可能对应多个线程,一个线程也可能对应多个SOCKET,之间的对应关系事先是无法预料的。
2、工作线程处理的过程中,存在被CPU挂起的可能,被中断的可能
那么,那么我的疑惑就是,如何保证,先来的线程甲先完成数据存放,后来的线程乙后完成数据存放呢,就是说,线程甲先保存ABC,然后线程乙再保存DEF
------解决方案--------------------
其实 我以前也纠结这个问题
你投递的时候等上一个完成了再投递另一个 发送和接收都是这样 同时只能有一个存在
------解决方案--------------------
我平时的做法是,每个套节字只投递一个WSARecv,这样就不会乱套了,每个Socket有一个关联的结构里保存接收的缓冲数据,然后把接收到的数据都放在那里,进行组包
看了至少一个星期的完成端口资料,原理基本明白,但是有一个问题,一直找不到理论上的根据,所以在项目中,还是不敢用完成端口模型。
简单的说,如何保证“先启动的工作线程先执行完,后启动的线程后执行完”
对于TCP传输来说,客户端发送ABCDEFG给服务器,服务器可能会一下受到ABCD,也可以只收到AB,但是不管怎么,接收的字符的顺序肯定等于发送的顺序,这是不用怀疑的。
以服务器接收数据为例,对于一个SOCKET链接,他可能在一个时间是线程甲为他服务,一会是线程乙为他服务。先来的线程处理先到的数据。线程甲乙都是把收到的数据往该SOCKET连接对应的数据存储区中存储。假设线程甲取来了客户端发送来的ABC,线程乙取来了客户端发送的DEFG
现在的问题就是,
1、一个SOCKET可能对应多个线程,一个线程也可能对应多个SOCKET,之间的对应关系事先是无法预料的。
2、工作线程处理的过程中,存在被CPU挂起的可能,被中断的可能
那么,那么我的疑惑就是,如何保证,先来的线程甲先完成数据存放,后来的线程乙后完成数据存放呢,就是说,线程甲先保存ABC,然后线程乙再保存DEF
------解决方案--------------------
其实 我以前也纠结这个问题
你投递的时候等上一个完成了再投递另一个 发送和接收都是这样 同时只能有一个存在
------解决方案--------------------
我平时的做法是,每个套节字只投递一个WSARecv,这样就不会乱套了,每个Socket有一个关联的结构里保存接收的缓冲数据,然后把接收到的数据都放在那里,进行组包