Чтобы не потерять разблокировку, удобнее использовать raii, а не руками вызывать Lock (если код конечно позволяет)
тогда счетчик можно перенести в класс Locable.
class Locker;
class Locable
{
friend Locker;
std::atomic<int> m_counter;
public:
Locable(): m_counter(0) {}
operator bool () const {return !m_counter; }
};
class Locker
{
Locker(const Locker&) = delete;
Locker& operator=(const Locker&) = delete;
Locable & m_locable;
public:
Locker(Locable & l):m_locable(l) { ++m_locable.m_counter; }
~Locker() {--m_locable.m_counter;}
};