Методы, которые не изменяют данные класса, являются поточно-ориентированными, только если объект никогда не изменен любым методом.В противном случае метод в другом потоке может изменить объект (под блокировкой, правильно), и вызов queue::empty()
в вашем потоке без получения блокировки может привести к состоянию гонки (в зависимости от его реализации).