🌓

一个有趣的Bug

今早一到公司,就看到隔壁组一堆人在讨论一个Bug,足足半个多小时没有结果。人散了以后,一位同事找我帮忙看一下,发现是因为一个函数被递归调用导致栈溢出并崩溃,但奇怪的是代码中并没有递归调用这个函数。看到这个现象,我立刻想到了以前遇到的这个Bug,经过排查,果然是类似的原因,于是十分钟不到就解决了问题,

阅读全文

检测Lua脚本中的死循环

论坛上有人问,所以把以前做的东西拿出来秀一下。Lua是一门小巧精致的语言,特别适用于嵌入其它的程序为它们提供脚本支持。不过脚本通常是用户编写的,很有可能出现死循环,虽说这是用户的问题,但却会造成我们的宿主程序死掉。所以检测用户脚本中的死循环并中止这段脚本的运行就显得非常重要了。可是,一个现实的问题是

阅读全文

用条件变量模拟WaitForMultipleObjects

WaitForMultipleObjects的轻量级模拟。代码

阅读全文

一个轻量级的事件对象

“事件”对象的一个轻量级实现,方法与“信号量”基本一样。class CSlimEvent{private: SRWLOCK m_lock; CONDITION_VARIABLE m_cv; BOOL m_manual; BOOL m_state;public: CSli

阅读全文

一个轻量级的信号量

基于SRWLOCK和条件变量(Condition Variable)实现,需要windows vista及以上操作系统,编译时_WIN32_WINNT要大于0x0600。基本功能和用CreateSemaphore创建出来的差不多,不过不支持跨进程使用,也模拟不了WaitForMultipleObje

阅读全文

多线程中的单件模式

单件模式可能是所有设计模式中最简单的一个了,但在C++中,尤其是还要支持多线程的话,要想写一个正确的实现却并不容易,不信请看:class CSingleton{public:CSingleton(){_tprintf( _T("CSingleton::Constructor: Before

阅读全文

编写可维护的代码(二)

假如一个系统中有多个模块,不妨命名为Module1, Module2, Module3…, 毫无疑问这个系统的启动过程中需要初始化所有这些模块, 而退出时要销毁它们, 那应该用下面哪种方法来完成这个任务呢?A. 让这些模块都支持一个IModule, 然后定义一个IModule*类型的数组, 把这些模

阅读全文

编写可维护的代码(一)

可维护性我认为主要由两个方面构成, 一是可读性, 也就是代码要能让人看懂; 二是可调试性, 出了问题可以很快的找到原因. 市面上讲设计的书很多, 但大部分侧重于灵活性和可复用性, 比如面向对象设计和设计模式等. 灵活和可复用并没有什么错, 但我认为可维护要更重要一些, 试想如果一个模块非常灵活并被大

阅读全文

一个支持多线程的内存池

不多解释了,直接上代码吧。

阅读全文

解决了一个困惑很久的bug

让这个bug困扰了很久,前一段太忙只找了个临时解决方案而没有追究原因,今天终于把它搞清楚了。由于测试时只在多CPU系统上出现,我甚至一度怀疑它是CPU的bug😂 。两个c/s结构的网络通讯程序,服务器端使用完成端口模型,客户端使用阻塞模型,双方以一种客户端发送命令,服务器端处理,然后返回应答的方式

阅读全文