std::vector的错误使用

上周五服务器线上出现了几次crash,拿回dump文件分析后发现代码是崩在了对一个引用的成员变量赋值上。 分析了半天也没看出来代码有什么不妥,就先搁置了。 今天同事又给我看了一段奇怪的代码,某个类成员函数返回了某个成员变量的引用,但是当指针为NULL时去调这个函数依然不会崩溃。 思来想去搞不明白,反汇编之后终于发现原因所在。 c++引用本质上也是指针,只是不能为NULL而已。因此返回引用其实就是返回这个变量的内存地址。也就是说这个函数实际的操作仅仅是拿this指针加上这个……

tcp使用的进一步了解

以前对socket的了解仅仅局限于listen/connect/epoll/select/close等这些API的表面使用。其具体语义以及一些状态都没有深究。总觉得这样写代码会出问题,今天咬咬牙把《tcp协议卷1》中的Tcp部分又看了一遍。发现由于对协议和API语义的了解不足,在程序中还是犯了不少错误。 TIME_WAIT状态是tcp网络编程中最不容易理解的地方。主动关闭的一方会经历TIME_WAIT状态, 这个状态会经历2MSL的时间。其目的就是为了可靠的实现TCP全双工连接的终止和允许老的重复分组消逝在网络中(具体可以参……

seqlock和rwlock

最近看《linux内核设计与实现》时看到一种叫seqlock的锁,其作用与rwlock有相仿的功能。 在读写频率不对等的情况下,使用普通的互斥锁显然并不是一个好主意。 由于读取内存中的数据并不会产生副作用(嵌入式除外),因此在数据不改变的情况下,多个读操作可以并发执行。 在读频率远大于写频率时,如果仅仅将写操作与读操作互斥,读与读之间并发执行,显然可以大幅提高程序的性能。 所以在这个时候,读写锁应运而生。使用读写锁时,多个读操作可以并发进行,但是只要有读操作在进行,……

lua的debug_hook接口应用

lua本身并没有提供调试器, 但是提供了一组称为debug_hook的API, 这组API可以用来编写自己的调试器或者一些其他的东西。 这两天的工作主要就是研究了一下debug_hook这组接口, 写了一个极简化的lua调试器和一个lua性能分析器. lua调试器现在仅支持break point, step, print, coutinue这几个功能。 由于最近写lua已经习惯于不用调试器了, 因为实现的比较简单。 下断点时, 将要断点所在的文件与行号存入表中。 在不考虑效率的前提下, 直接用line mode来hook中每一行的运行,然后……