Честно говоря, многие реальные многопоточные программы делают не намного больше, чем чтение / запись некоторого значения (строкового или целого) - циклические буферы (как может понадобиться сетевое соединение), устройства чтения / записи файлов журнала, и т.д.
На самом деле, я бы сказал, что если вы реализуете (или находите) сплошной (и универсальный) кольцевой буфер, а затем запускаете всю межпотоковую связь через эти буферы в качестве единственной точки контакта, это покроет очень большая часть любой многопоточной синхронизации, которая вам может понадобиться. (Если вы не работаете в среде, совместимой с модными словечками, и вам не нужно добавлять в список модных слов «предприятие», «обмен сообщениями» или что-то еще ... или вы пишете базу данных или операционную систему.)
(Обратите внимание, что «циклический буфер» является довольно C-центричным термином, корнем которого является относительно прямое манипулирование блоком памяти. Класс Queue в Python реализует тот же базовый принцип в виде списка, и я уверен, что многие другие языки имеют концептуально похожие конструкции под немного другими именами ...)