Вопрос, который вы задали, является классическим случаем «ограниченного ожидания», и существует известный способ решения этой проблемы с помощью [Алгоритма пекарни].
Основная идея здесь заключается в том, что вы поддерживаете два счета, первый - текущий номер обслуживания, а другой - глобальный счет (аналог пекарни с рабочим номером). Всякий раз, когда новый поток входит (то есть ожидает мьютекс), тогда увеличивают глобальное число и выдают билет потоку. Затем этот поток ожидает номер билета, пока текущий номер обслуживания не станет равен номеру билета.
Таким образом, мы можем поддерживать порядок так, чтобы поток, который идет первым, сначала захватывал мьютекс.
Я не уверен, что стандартные библиотеки реализуют мьютекс таким образом внутри, но не будет так сложно реализовать алгоритм Bakery для ваших нужд.