На практике такое не всегда требуется.
Например, движок наносекундной синхронизации в эмуляторе ДВК просто не позволяет произойти событию, которое назначено на более позднюю наносекунду, чем текущая эмулируемая наносекунда. При этом источником виртуального времени является процессор ( если процессоров на шине несколько - то первый, зарегистрировавшийся на шине ). Процессор выполняет команду и если в процессе выполнения команды не было обращения к устройствам, то хотя процессор и считает виртуальное время максимально подробно, отдельно учитывая продлжительность всех микро-событий при выполнении команды - барьер синхронизации просто сдвигается сразу на столько виртуальных наносекунд, сколько заняло выполнение всей команды целиком. Если какие-то ожидавшие события при этом вышли за барьер - они все выполнятся до следующей команды процессора в порядке ожидавшегося ими виртуального времени. Если же в ходе выполнения команды на каком-то этапе происходит обращение к регистру устройства - процессор передаёт управление эмулятору устройства дважды - перед обращением и после обращения, при этом виртуальное время учитывает все микро-события произошедшие в процессоре по ходу выполнения текущей команды.
Такой подход в подавляющем большинстве случаев ( когда в одном такте больше 100 наносекунд ) на два порядка точнее потактового и практически не добавляет накладных расходов.