Когда поток пытается получить блокировку мьютекса, если этот мьютекс уже удерживается, обычно он использует вызов ядра ОС, чтобы указать, что он ожидает, а затем, когда поток, который в данный момент удерживает блокировку, разблокируется. затем мьютекс вызовет ядро ОС, чтобы разбудить один из ожидающих потоков.
То же самое относится и к семафору, за исключением того, что оно блокируется только в том случае, если счет уменьшается до нуля, а потоки пробуждаются только при увеличении счетчика выше нуля.
Оживленное ожидание - это когда вы не блокируетесь и не спите, ожидая чего-то, а постоянно проводите опрос в цикле, поэтому процессор всегда занят, но не делает ничего полезного.
Чтобы действительно достичь занятого ожидания, вам нужна атомарная переменная, но потоки POSIX не предоставляют такой возможности, поэтому вы не можете действительно написать занятое ожидание в pthreads. Самое близкое, что вы можете получить, это заблокировать мьютекс, прочитать флаг, разблокировать мьютекс, выполнить цикл, если флаг не был установлен. Это многократно блокирует и разблокирует мьютекс, но не ожидает готовности данных. В этой ситуации вы должны вместо этого использовать условную переменную.
Как правило, вы говорите, что поток спит, если он вызвал что-то вроде usleep
, чтобы приостановить собственное выполнение на определенный период времени. Это в отличие от блокировки, когда он ожидает определенного сигнала, который будет предоставлен другим потоком.