Блокировка означает, что поток по расписанию отключен от ЦП во время ожидания события.Когда поток выполняется по расписанию, он не потребляет циклов ЦП и позволяет другим потокам выполнять работу или переводить ЦП в состояние пониженного энергопотребления, если нет других потоков, ожидающих запуска.
Блокировка одного потокане влияет на другие темы, которые вы можете иметь в процессе.Блокирующий вызов блокирует только вызывающий поток.
Например, read
блокируется, когда в канале нет данных для чтения.Когда данные поступают, они «разблокируются» и возвращается вызов read
.
В ядре каждое описание файла и другие объекты, которые можно заблокировать (например, mutex
или condition_variable
), имеют список ожидающих потоков,Когда поток блокируется на объекте, он добавляется в список ожидания этого объекта и откладывается от процессора.Всякий раз, когда происходит событие для объекта, ядро проверяет список ожидания для ожидающих потоков для такого события, и если есть какой-либо один или несколько потоков, снова планируются и вызовы блокировки в конечном итоге возвращаются.
В неблокирующем режиметакие вызовы не блокируют, а немедленно возвращают код ошибки с errno
, установленным на EWOULDBLOCK
или EAGAIN
, которые в настоящее время являются двумя разными именами для одного и того же значения errno
.(вызовы pthread не устанавливают errno
, но возвращают значение ошибки напрямую).