一个同事一个同事告诉我,他花了很多时间调试竞争条件.罪魁祸首原来是这样的:
void foo() { ScopedLock(this->mutex); // Oops,should have been a named object. // Edit: added the "this->" to fix compilation issue. // .... }
为了防止情况再次发生,他在定义ScopedLock类之后创建了以下宏:
#define ScopedLock(...) Error_You_should_create_a_named_object;
这个补丁工作正常.
有没有人知道任何其他有趣的技术来防止这个问题?
解决方法
如果你要定义一个宏,我可能会想定义一个宏:
#define GET_SCOPED_LOCK(name,mtx) ScopedLock name(mtx)
并停止创建除宏之外的对象.
然后如果有帮助,将ScopedLock重命名为ThisClassNameShouldNotAppearInUserCode.