Это один из способов избежать блокировки конструктором lock_guard
указанного mutex
:
std::mutex mtx;
mtx.lock();
std::lock_guard<std::mutex> lck(mtx, std::adopt_lock);
Цель состоит в том, чтобы позволить вашему lock_guard
стать владельцем mutex
, который выуже заблокирован.
От: https://en.cppreference.com/w/cpp/thread/lock_guard/lock_guard
явный атрибут lock_guard (mutex_type & m);(1) (начиная с C ++ 11)lock_guard (mutex_type & m, std :: accept_lock_t t);(2) (начиная с C ++ 11)lock_guard (const lock_guard &) = удалить;(3) (начиная с C ++ 11)Приобретает право собственности на данный мьютекс m.
1) Effectively calls m.lock(). The behavior is undefined if m is not a recursive mutex and the current thread already owns m.
2) Acquires ownership of the mutex m without attempting to lock it.
Поведение не определено, если текущему потоку не принадлежит m.
3) Конструктор копирования удален.
Поведение не определено, если m уничтожено до объекта lock_guard.