Как избежать блокировки с помощью lock_guard? - PullRequest
0 голосов
/ 04 января 2019

https://en.cppreference.com/w/cpp/thread/lock_guard

(конструктор)
создает lock_guard, опционально блокируя указанный мьютекс

Как можно избежать блокировки, если онаопционально

1 Ответ

0 голосов
/ 04 января 2019

Это один из способов избежать блокировки конструктором 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.

...