В информатике отношение « произошло раньше » (обозначается как ) — это отношение между результатом двух событий, так что если одно событие должно произойти до другого, результат должен это отражать, даже если эти события в действительности выполняются не по порядку (обычно для оптимизации потока программы). Это подразумевает упорядочивание событий на основе потенциальной причинно-следственной связи пар событий в параллельной системе, особенно в асинхронных распределенных системах . Оно было сформулировано Лесли Лэмпортом . [1]
Отношение «произошло раньше» формально определяется как наименее строгий частичный порядок событий, такой что:
Если два события происходят в разных изолированных процессах (которые не обмениваются сообщениями напрямую или косвенно через сторонние процессы), то говорят, что эти два процесса являются параллельными, что не является ни тем , ни другим. [2]
Если существуют другие причинно-следственные связи между событиями в данной системе, например, между созданием процесса и его первым событием, эти связи также добавляются в определение. Например, в некоторых языках программирования, таких как Java, [3] C, C++ или Rust, ребро happen-before существует, если память, записанная оператором A, видна оператору B, то есть если оператор A завершает свою запись до того, как оператор B начинает свое чтение.
Как и все строгие частичные порядки, отношение «произошло раньше» является транзитивным , иррефлексивным (и, что бессодержательно, асимметричным ), то есть:
Заметим, что свойство асимметрии напрямую следует из предыдущих свойств: от противного предположим, что имеем и . Тогда по транзитивности имеем что противоречит нерефлексивности.
Процессы, составляющие распределенную систему, не имеют знаний об отношении «произошло-раньше», если они не используют логические часы , такие как часы Лампорта или векторные часы . Это позволяет разрабатывать алгоритмы для взаимного исключения и решать такие задачи, как отладка или оптимизация распределенных систем.