Если вы уверены, что хотите подождать и никогда не прерываться, используйте режим сна в POSIX или режим сна в Windows.В POSIX сон занимает время в секундах, поэтому, если вы хотите, чтобы время было короче, есть варианты типа usleep()
, которые используют микросекунды.Для сна в Windows требуются миллисекунды, редко требуется более тонкая детализация, чем эта.
Возможно, вы хотите подождать некоторое время, но хотите разрешить прерывания, например, в случае чрезвычайной ситуации.сон может быть прерван сигналами, но в этом случае есть лучший способ сделать это.
Поэтому на практике я обнаружил, что вы на самом деле делаете ожидание события или условной переменной с таймаутом.
В Windows ваш звонок WaitForSingleObject
.В POSIX это pthread_cond_timedwait
.
В Windows вы также можете использовать WaitForSingleObjectEx
, а затем вы можете «прервать» ваш поток с помощью любой задачи, поставленной в очередь, вызвав QueueUserAPC
.WaitForSingleObject (Ex) вернет код, определяющий причину его выхода, поэтому вы будете знать, когда он вернет состояние «TIMEDOUT», что он действительно сделал тайм-аут.Вы устанавливаете ожидаемое событие, когда хотите, чтобы оно завершилось.
С помощью pthread_cond_timedwait
вы можете передать широковещательную переменную условия.(Если несколько потоков ожидают одного и того же, вам нужно будет транслировать, чтобы разбудить их всех).Каждый раз, когда он зацикливается, он должен проверить состояние.Ваш поток может получить текущее время и посмотреть, прошло ли оно, или он может посмотреть, было ли выполнено какое-то условие, чтобы определить, что делать.Если у вас есть какая-то очередь, вы можете проверить это.(Ваш поток автоматически заблокирует мьютекс, который он использовал для ожидания условной переменной, поэтому, когда он проверяет условие, он имеет к нему единственный доступ).