5 ms·
To avoid this insidious bug: std::lock_guard<std::mutex>(m); // guard is immediately thrown away versus the correct std::lock_guard<std::mutex> g(m)
by thestoicattack 7y ago
To avoid this insidious bug:
std::lock_guard<std::mutex>(m); // guard is immediately thrown away
versus the correct
std::lock_guard<std::mutex> g(m); // hold mutex til end of scope
- dgellow 7y agoNote for people who don’t see the difference: if a guard doesn’t have a name, it won’t survive until the end of the scope, thus doesn’t guard anything.
- deleted 7y ago[deleted]
- deleted 7y ago[deleted]
- ynfnehf 7y agoI might be wrong here, but I think that the first one is a declaration of a guard with the name m using the default constructor. The same way that int (a); and int a; are equivalent. So the guard should remain until end of scope, but won't guard anything.
- clappski 7y agolock_guard doesn’t have a default ctor, you have to pass a mutex (or presumably invoke a move ctor, but I can’t see one on cppref).
- bstamour 7y agoLock guard has no default constructor, so the line will in fact materialize a temporary lock guard around the mutex m, then throw it away at the semi-colon, thus locking nothing.