BTW, that code is illegal as you cannot return an lvalue reference to a temporary, so your code should not compile ( it does just because you're using a VC language extension ). Second, that warning seems wrong too as the switch should pass control to the last return statement when the wait result doesn't match ...

anyway, another possibility could be

4) to use a RAII syncronization object and throw an exception on failure
5) to return a pointer to CM ( being NULL in case of error ) or boost:: optional<CM&> if for some reason the Instance method is expected to not return a valid instance even under "normal" circumstances ...