Программные приемы решения проблемы когерентности позволяют обойтись без дополнительного оборудования или свести его к минимуму [CHEO90]. Задача возлагается на компилятор и операционную систему. Привлекательность такого подхода в возможности устранения некогерентности еще до этапа выполнения программы, однако, принятые компилятором решения могут в целом отрицательно сказаться на эффективности использования кэш-памяти.
Компилятор анализирует программный код, определяет те совместно используемые данные, которые могут причиной некогерентности, и помечает их. В процессе выполнения программы операционная система или соответствующая аппаратура предотвращают кэширование (занесение в кэш-память) помеченных данных и для доступа к ним, как при чтении, так и при записи, приходится обращаться к «медленной» основной памяти. Учитывая, что некогерентность возникает только в результате операций записи, происходящих значительно реже, чем чтение, рассмотренный прием следует признать недостаточно эффективным.
Более эффективными представляются способы, где в ходе анализа программы определяются безопасные периоды использования общих переменных, и так называемые критические периоды, где может возникнуть некогерентность. Затем компилятор вставляет в генерируемый код инструкции, позволяющие обеспечить когерентность кэш-памятей именно в такие критические периоды.