как процессор знает, какой процесс разблокировать?
процессор ничего не знает; он просто слепо исполняет цепочку машинных инструкций, которые ему были предоставлены.
библиотека с резьбой, с другой стороны, была тщательно разработана для обработки такого рода вещей. Кроме того, каждая современная/многозадачная ОС включает в себя планировщик потоков, который загружается в память при загрузке и управляет потоками, которые запускаются, и когда. Он работает вместе с библиотекой потоков, чтобы правильно обрабатывать проблемы блокировки/разблокировки.
Итак, возникает вопрос: как программное обеспечение ОС знает, какой поток просыпаться после разблокировки мьютекса?
Конечно, фактическая реализация будет отличаться от ОС, но концептуально вы можете представить каждый объект mutex, содержащий связанный список, и когда поток пытается заблокировать уже существующий мьютекс, поток добавляет себя в хвост связанного списка, а затем сообщает планировщику положить его (поток) в режим сна.
Позже, когда мьютекс разблокирован, процедура разблокировки выталкивает первый спальный поток (если есть) из связанного списка, переназначает принадлежность мьютекса к этому потоку и затем просит планировщика проснуться этот поток как можно скорее.
(Предостережения: реализация в реальном мире, вероятно, будет немного сложнее, чем это, поскольку она должна быть осторожна, чтобы избежать условий гонки и максимальной производительности, но я думаю, что это дает вам представление о том, как это можно сделать Обратите внимание, что в этом примере реализации потоки будут получать мьютексы в режиме первого-первого/первого заказа, то есть в том же порядке, в котором они называются lock(), но во многих реалиях реального мира это упорядочение не гарантируется, поэтому вы не должны полагаться на это)
Вы спрашиваете, как потоки/процессы, ожидающие мьютекса, планируются ядром для запуска автономной «проверки и установки» команды ЦП, чтобы попытаться получить мьютекс? Я не верю, что есть какие-то гарантии относительно того, какой поток сначала получит мьютекс, поэтому может быть несколько функциональных реализаций этого. –