Concurrency and parallelism
CP.44
Помните, что нужно назвать ваши `lock_guard`s и `unique_lock`s
Причина
Локальный безымянный объект - это временный объект, который немедленно выходит из области видимости.
Пример
// global mutexes
mutex m1;
mutex m2;
void f()
{
unique_lock<mutex>(m1); // (A)
lock_guard<mutex> {m2}; // (B)
// do work in critical section ...
}
Это выглядит достаточно невинно, но это не так. At (A), m1 - это конструируемый по умолчанию локальный unique_lock, который затеняет глобальный ::m1 (и не блокирует его). At (B) безымянный временный lock_guard сконструирован и блокирует ::m2, но сразу же выходит из области видимости и разблокирует ::m2 снова. Для остальной функции f() ни один mutex не заблокирован.
Применение
Отметьте все безымянные lock_guards и unique_locks.