On Freitag, 21. August 2020 15:08:09 CEST Paolo Bonzini wrote: > On 21/08/20 13:12, Christian Schoenebeck wrote: > > There is a golden rule with recursive locks: You always have to preserve a > > clear hierarchy. Say you have the following recursive mutexes: > > > > RecursiveMutex mutex0; > > RecursiveMutex mutex1; > > RecursiveMutex mutex2; > > ... > > RecursiveMutex mutexN; > > > > where the suffix shall identify the hierarchy, i.e. h(mutex0) = 0, > > h(mutex1) = 1, ... h(mutexN) = N. Then the golden rule is that in any call > > stack the nested locks must always preserve the same transitive hierarchy, > > > e.g.: > That's also what you do with regular locks.
You can't do that with non-recursive mutexes if you have cyclic dependencies. > But the difference is that with regular locks you can always do > > void bar(std::unique_lock<std::mutex> &mutex3_guard) > { > ... > mutex3_guard.unlock(); > synchronized(mutex2) { > } > mutex3_guard.lock(); > ... > } Right, if you are able to clearly judge that this unlock is really safe for all layers involved. Okay never mind, I see that we'll keep split on this recursive lock issue anyway. Sorry for the noise Paolo! :) Best regards, Christian Schoenebeck