今天读《Windows 网络编程》,第5章 - Winsock IO方法。
在讲到 “套接字 阻塞模式”时,有下面一段话和代码:
这段代码的问题在于...,只有从缓冲区读回一些内容,recv才会返回...。有时会事先查看是否存在必要的数据量可读。然而,在不实际读入数据的前提下,仅仅查看数据是一种不好的编程习惯。应尽力避免。... 为避免在没有查看系统网络缓冲的情况下,由于数据的缺乏,而造成应用程序完全陷于凝固状态。一个办法是建立一个读线程、一个处理线程,两个线程共享同一数据缓冲区(用同步对象进行同步)。读线程负责读入数据,并置入共享缓冲区,当读入到计算线程所需的最少数据量之后,触发一个事件,通知处理线程开始工作。
对于分别采用读线程和处理线程这段代码来说,我没有能够理解它(与上面代码相比)的优点。
如果数据量不足,ReadThread里面的while循环就会一直recv数据,直到接收到NUM_BYTES_REQUIRED的数据量,才设置事件,此前ProcessThread将一直Wait。ProcessThread开始工作后,ReadThread由于同步对象被占用,会阻塞在EnterCriticalSection。这么处理有什么好处呢?它解决了文字中所说的“凝固状态”的问题吗?ReadThread中while循环的recv如果读不到数据,不也是一直阻塞吗?ReadThread工作的时候,ProcessThread一直在等待,也没有工作。ProcessThread工作的时候ReadThread再等待同步对象,也没有继续recv。
请大家给小弟解惑。谢谢。-_-