В то время как коллега сказал мне, что он провел много времени, отлаживая состояние гонки. Преступник оказался чем-то вроде этого:
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;
Этот патч отлично работает.
Кто-нибудь знает какие-либо другие интересные методы для предотвращения этой проблемы?