处理系统Event对象的疑问(WinSock相关),张无忌兄进来看看(50分)

  • 主题发起人 主题发起人 yeow
  • 开始时间 开始时间
Y

yeow

Unregistered / Unconfirmed
GUEST, unregistred user!
在WinSock的5种异步模型中:事件选择模式和使用事件Overlap I/O的方式都用到了系统核心
对象Event。系统是利用WSAWaitForMultipleEvents函数来等待该Event被触发的。当该Event
被触发时或者超时则返回。注意:这里等待的Event对象一定是手工重置的,即触发后就一直
保持在激发状态。触发后,就可以接着处理数据了。处理完成后,一定要紧记调用
WSAResetEvent函数重新设置该Event为未激发状态。问题来了:如果在长连接情况下,该事件
对象(假设绑定的是FD_READ)已经激发了。正在处理中的情况下(Event尚未重置),
又有新的数据进来了,本来是可以触发事件的,结果……
这种情况会出现么?如果会,怎么解决呢?如果不会,为什么呢?
谢谢!
 
怎么没人回答啊?这个问题很难吗?
 
我觉得应该把数据接收和数据处理分开来.
接收到数据后,从新开一个线程处理数据,在线程中用Event.而在接收的过程中不做限制.
这样就不会因为需要处理而丢失后来的数据了.
 
你等待的是多个事件,如果目前正在处理的恰好是这个事件触发的,那么将会丢失,如果不是同一个,就没有问题,你不会Reset所有的事件.
正如 LeeChange所说,接受数据和数据的处理通常应该分开, 防止数据丢失或者阻塞.接收数据的线程接收之后,唤醒(或者通知)其他的线程处理,并立即返回,接收下一个数据.通常要用到一个对列.
 
楼主放心好了,如果你理解了TCP,你就知道根本不会丢包,即使近来的包
你没有处理,下次的FD_READ里你一样可以读出上次进来的包!
 
接受答案了.
 
后退
顶部