yigal_s' Journal
 
[Most Recent Entries] [Calendar View] [Friends View]

Monday, April 23rd, 2012

    Time Event
    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 использоваться для мультитреда не должен. Никогда. Так что, особых причин глубоко задумываться над подобными сценариями у меня не было.

    << Previous Day 2012/04/23
    [Calendar]
    Next Day >>

About LJ.Rossia.org