Вывод, который я получаю с мьютексом ... это первый поток 1 [проходит через весь цикл], а затем поток 2.
Это из-за того, как ваш l oop использует блокировку: самое последнее, что делает тело l oop, это разблокирует блокировку. Следующее, что он делает в начале следующей итерации, это снова блокирует блокировку.
Другой поток может быть заблокирован, фактически находясь в спящем режиме, ожидая мьютекс. Когда ваш поток 1 снимает блокировку, планировщик ОС все еще может запускать свои алгоритмы, пытаясь выяснить, как на это реагировать, когда поток 1 возвращается и снова блокирует блокировку.
Это похоже на гонку чтобы заблокировать мьютекс, и нить 1 находится на стартовой линии, когда пистолет гаснет, а нить 2 сидит на скамейке, связывая свои туфли.
При использовании спин-блокировки ... порядок выполнения между потоками, которые чередуются
Это потому, что «заблокированный» поток действительно не заблокирован. Он все еще активно работает на другом процессоре, пока ждет. У него гораздо больше шансов выиграть блокировку, когда ее освободит первый поток.