Здравствуйте, alex_public, Вы писали:
_>А я нигде и не говорил о многозадачности/многопоточности. Я говорил о важности модификатора volatile для низкоуровневого программирования.
Ну вот это вот — типичная подмена понятий. Изначально делалось сильное утверждение про то, что volatile появился в C ради поддержки многозадачных ОС, которые и были его основным применением.
А теперь мы видим, что единственное приличное применение volatile — это memory-mapped HW, которое строго ортогонально многозадачности оси.
Даже во вполне однозадачной ОС уровня MS-DOS работа с регистрами оборудования, отображёнными в память, будет требовать volatile, и, если я правильно понимаю принцип барьеров, то они тут неприменимы.
S>>Про перебор i в цикле я примера увы, не понял. С учётом того, что i у нас никуда не отображена, мы крутим регистр процессора. S>>Скорее всего, речь идёт о трудноуловимой баге — программист пытается выполнить задержку ненадёжным способом. _>Да, это именно задержка. И вполне себе надёжная. Т.е. понятно что аппаратный таймер лучше, но не во всех случаях его можно применить.
Нет, это ненадёжная задержка. Впендюрив сюда volatile, программист запрещает "устраняющие" оптимизации компилятору.
Но, во-первых, это никак не влияет на выбор размещения переменной, поэтому величина задержки получается произвольной даже в пределах одной аппаратуры — то ли будет выполнен сброс в память, то ли обойдёмся регистром. Какова будет разница в величине задержки?
Во-вторых, даже в пределах одной аппаратуры у нас может плавать тактовая частота, и скорость исполнения этого цикла будет меняться в разы.
Во-третьих, нет никакой гарантии, что во время цикла не будет выполнено вытеснение. Тогда можно запросто получить задержку на порядки больше, чем ожидалось.
Даже если бы у меня были выполнены необходимые предусловия, типа "это platform-specific code, и я знаю величину тактовой частоты", я бы не рискнул писать этот код в таком виде — он же выглядит как переносимый!
Там должно быть volatile asm(""), и дальше фигачим ровно те инструкции, тайминг которых я проверял в лаборатории.
_>Для полноценного спинлока тебе не хватит ни volatile, ни fences. Для него необходимы уже атомарные операции типа CAS или аналоги, поддерживаемые процессором.
Ну, тут мне не хватает квалификации для полноценного разговора. В рамках нашей дискуссии достаточно сказать, что volatile для спинлока бесполезен.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.