[C++] 在编写服务器代码时,应该选择时钟还是线程来做心跳包处理

3835 人浏览 | 时间: 2016-11-13 14:03:55 | 作者: codexia

    在此之前,我先感谢C++技术网之前回答过的问题,接下来我问的问题是接在 Windows Socket IOCP 完成端口之后的。

    C++技术网之前提供的答案,是看指定的一些书籍。我之后也是下载来看,发现书中讲的是很详细,但是这一看也不知不觉花了四个月的时间,有些内容没看完,也有些也没理解好。

    尽管如此,关于 Windows Socket IOCP,我也只能到处找几个源码加书中的理解也勉强算是可以理解的了。但还有一些疑问在我这里,就好比关联到完成端口的套接字,关联是关联了,但是如何解绑呢?这又是很头疼的问题,最后搜索出来的答案是只要 closesocket() 就好了,IOCP 会自动检查句柄是否有效,如果无效,将会自动解绑。虽然我不知道算不算正确,但总比没有答案的好;接下来还有内存异常的处理;内存池等问题。来来回回也算是遇到了很多问题。

    关于其他的一些问题,之后我再慢慢通过C++技术网一一提问吧。

    话说得有点长了,不好意思,接下来是要问的问题。

    在编写服务器代码时,应该选择时钟还是线程来做心跳包处理呢?

    时钟:

    A-1) 优点就是指定每隔一段时间,就会执行到指定的函数。不管指定函数有没有执行完成,到了一定的时间又会去执行。就好比一个队长每隔段时间叫一名队员去做事,然后队长就不管队员是否把事情做完,就去休息,等待下段时间继续叫一名队员去做事。

    A-2缺点:如果在操作全局对象,会造成访问冲突。就像一名队员正在移除已经烂掉的货物,突然来了一名新的队员来操作这批货物,然后就冲突了。这还不算重要,加个锁可以了,重要的是时钟是占用主线程的,会造成卡机现象,而且还需要一个窗口句柄。

    线程:

    B-1) 说白了就是一个队里面只有一个队员来操作这批货物。

    但是我看到别人说明都是推荐时钟来做心跳包,为什么呢?

    最后感谢C++技术网的回答。


C++技术网解答:

    许多细节在书上没有明确的答案,这都需要自己在实践中寻找答案。Windows平台上最好的就是MSDN了。这是开发文档,所有细节都在这里面。书上只是给了基本的原理流程,并不是开发文档。所以在对一个问题很不清楚的情况,网上也找不到合适的答案,最后一招就是MSDN。或者,最好的就是直接看MSDN了。MSDN基本上是英文的,所以这一点要适应。

请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

相关阅读