I have two use cases.
A. I want to synchronise access to a queue for two threads.
B. I want to synchronise access to a queue for two threads and use a condition variable because one of the threads will wait on content to be stored into the queue by the other thread.
For use case A I see code example using std::lock_guard<>. For use case B I see code example using std::unique_lock<>.
What is the difference between the two and which one should I use in which use case?
The difference is that you can lock and unlock a
std::unique_lock.std::lock_guardwill be locked only once on construction and unlocked on destruction.So for use case B you definitely need a
std::unique_lockfor the condition variable. In case A it depends whether you need to relock the guard.std::unique_lockhas other features that allow it to e.g.: be constructed without locking the mutex immediately but to build the RAII wrapper (see here).std::lock_guardalso provides a convenient RAII wrapper, but cannot lock multiple mutexes safely. It can be used when you need a wrapper for a limited scope, e.g.: a member function:To clarify a question by chmike, by default
std::lock_guardandstd::unique_lockare the same. So in the above case, you could replacestd::lock_guardwithstd::unique_lock. However,std::unique_lockmight have a tad more overhead.Note that these days (since, C++17) one should use
std::scoped_lockinstead ofstd::lock_guard.