Не уверен на 100%, что вы имеете в виду, я думаю, вы имеете в виду последовательный вызов pop
и empty
в одной и той же теме? Как и в
while(!x.empty()) x.pop();
std::lock_guard
, следует RAII. Это означает, что конструктор
std::lock_guard<std::mutex> lock(m);
получит / заблокирует мьютекс, а деструктор (когда lock
выйдет из области видимости) снова освободит / разблокирует мьютекс. Поэтому он разблокируется при следующем вызове функции.
Внутри pop
вызывается только data.empty()
, который не защищен мьютексом. Вызов this->empty()
внутри pop
действительно приведет к неопределенному поведению.