Мьютексы обеспечивают взаимное исключение, а не упорядочение.Вам нужно добавить что-то большее или другое, чтобы контролировать относительный порядок операций между потоками.Для этой цели обычными компаньонами мьютексов являются условные переменные .Вы можете выполнять свою работу с одним мьютексом, одной условной переменной и одной обычной общей переменной.В качестве альтернативы, пара семафоров могла бы справиться с вашей конкретной задачей аккуратно и чисто.
Если единственные объекты синхронизации, которые вы можете использовать, это мьютексы, то вы можете попробовать подход мьютекса / CV без CV.Ключевым моментом здесь, с или без резюме, является наличие общей переменной, которая каким-то образом указывает на то, в какой очереди поток.Каждый поток пытается заблокировать мьютекс.В случае успеха поток проверяет переменную общего доступа, чтобы определить, настала ли очередь этого потока, и если это так, он выполняет соответствующую работу, а затем освобождает мьютекс.Если поток блокирует мьютекс и обнаруживает, что это его ход , а не , он освобождает мьютекс и возвращается назад, чтобы повторить попытку.Проблема здесь в том, что для потока возможно прохождение неопределенного количества времени без планирования, и это то, что добавляет переменную условия в адреса смешивания.