今天发现程序中有一个bug,是由异常安全引起的。
代码中为了同步数据的访问,使用了一个critical section,当代码出现异常时不会调用LeaveCriticalSection,所以出现了死锁。
这是一个很常见的问题,也很容易解决,即为critical section编写一个lock类,使用构造函数和析构函数来执行EnterCriticalSection和LeaveCriticalSection。简而言之就是使用scope lock技术。
然而为什么当初没有这样做而直接使用API呢?呵呵,因为当初做这部分的时候仔细考虑过,结论是 - 不可能有异常抛出。
但是后来随着需求变更、代码演进,就会有异常抛出的可能。
算是得到一个教训吧: 编写异常安全的代码永远是值得的投入。