Мне нравится думать о синхронизации потоков как о восходящей, когда процессор и операционная система предоставляют конструкции, от примитивных до более сложных.
На уровне процессора у вас есть CAS и LL / SC, которые позволяют вам выполнять тест и сохранять в одной атомарной операции ... у вас также есть другие конструкции процессора, которые позволяют вам отключать и включать прерывание (однако они считаются опасными .. . при определенных обстоятельствах у вас нет другого выбора, кроме как использовать их)
операционная система предоставляет возможность переключения контекста между задачами, которые могут происходить каждый раз, когда поток использует свой временной интервал ... или это может происходить по другим причинам (я приду к этому)
тогда есть конструкции более высокого уровня, такие как мьютексы, которые используют эти примитивные механизмы, предоставляемые процессором (подумайте о вращающемся мьютексе) ... которые будут постоянно ждать, пока условие станет истинным, и проверять это условие атомарно
тогда этот вращающийся мьютекс может использовать функции, предоставляемые ОС (переключение контекста и системные вызовы, такие как yield, который передает управление другому потоку) и дает нам мьютексы
эти конструкции в дальнейшем используются конструкциями более высокого уровня, такими как условные переменные (которые могут отслеживать, сколько потоков ожидают мьютекса и какой поток разрешить первым, когда мьютекс станет доступным)
Эти конструкции могут быть использованы для обеспечения более сложных конструкций синхронизации ... пример: семафоры и т. Д.
person
jsshah
schedule
03.03.2010