10:00a |
volatile мой volatile... ( в сотый раз о неупорядоченном доступе в память) То ли я чуток заглючил, то ли в моём понимании архитектуры C on x86 наметилось очередное запоздалое прозрение.
Итак, с одной стороны вроде бы известно, что работа с volatile переменными устроена так, что она не переупорядочивается, т.е. внешние устройства будут видеть их запись и чтение ровно в том порядке, как это подразумевается логикой кода на С.
С другой стороны, известно, что расстановка memory-barriers в код, сгенерированный для x86 практически невозможна, поскольку он должен бежать на тех старых моделях процессоров, которые не поддерживают коды команды memory barriers. И вроде бы, никто до сих пор не наблюдал (?), чтобы компилятор генерил interlocked-instructions для простого доступа к volatile переменной.
Теперь. Что имеем:
volatile int va, vb; int a, b;
va = a; //1 b = vb; //2
Из-за переупорядочивания доступа к памяти на аппаратном уровне (конкретно, из-за буферизации операций записи во внешнюю память), присваивание переменной va может в реальность произойти позже, чем чтение переменной vb.
Т.е. конечно тут надо б еще покопаться в документации, возможно вполне, что эта самая буферизация запрещена для случаев доступа к некешируемой памяти, так что для реальных случаев маппирования регистров устройства на память (такая херня вообще имеется ли в реальных имплементациях периферии PC?) всё будет хорошо.
С другой стороны, выходит, что при доступе к обычной памяти volatile всё-таки не обеспечит гарантированного упорядочивания с точки зрения разных тредов/ядер. Как бы вопреки интуитивному восприятию спецификации языка. Интересно, а gcc тут что-то делает иначе, чем VC? Мне это по ряду причин представляется сомнительным. А проверять сейчас неохота. ------------------------
Вообще, всё это понимание в программировании чуток отдаёт религией. В том плане, что ты можешь думать, что всё уже понимаешь более-менее в какой-то частной области, и вдруг выясняется, что какой-то очень простой вещи не понимал. Т.е. я не понимал, что доступ к двум volatile может переупорядочиваться.
Впрочем, гуру мультитрединга учат, что volatile использоваться для мультитреда не должен. Никогда. Так что, особых причин глубоко задумываться над подобными сценариями у меня не было. |