Каков самый легкий (самый) весовой барьер памяти GCC в таком случае?

У меня есть следующий код C:

...
data[index] = something;
a_write_memory_barrier();
index = new_index;
...

Код не защищен блокировкой (другие просто читают data и index), я хочу убедиться, что data[index] сохранен перед обновлением index. Вокруг этого кода есть операции записи и чтения памяти других переменных, но они не имеют значения, поэтому GCC может свободно переупорядочивать их (и я надеюсь, что это делается для оптимизации). Просто гарантируйте, что порядка data[index] и index достаточно. Как следует реализовать a_write_memory_barrier() для достижения этой цели?


person W.Sun    schedule 04.11.2012    source источник
comment
См. stackoverflow.com/questions/8896092/   -  person dbrank0    schedule 04.11.2012


Ответы (1)


Если вам нужно позаботиться о неупорядоченном выполнении (вы, вероятно, работаете в распределенной среде), вам нужно подумать о загрузке, хранении, хранении и полных барьерах, конечно, если ваша архитектура поддерживает TSO (общий порядок хранения), чем вы не не заботьтесь о барьерах хранения, ваша операция записи будет последовательной, как написано в коде.

Если вы, с другой стороны, беспокоитесь о переупорядочении компилятора, подумайте об использовании Volatile (погуглите)

В вашем примере барьер хранилища решит вашу проблему, реализация такого барьера зависит от архитектуры и используемого вами компилятора:

e.g.

для компилятора sparc и gcc:

   #define MEMBAR_STORESTORE()  asm volatile ("membar #StoreStore":::"memory")
person Michael    schedule 04.11.2012
comment
Предоставленный вами код является барьером памяти, который предотвращает переупорядочивание любых хранилищ и загрузок вокруг него. Я просто хочу предотвратить изменение порядка index и data[index], а не других. - person W.Sun; 04.11.2012
comment
хм... спасибо, но если есть, скажем, a=1; ... (code block in the question) ... b=2;, не будет ли MEMBAR_STORESTORE() также препятствовать переупорядочению a=1 и b=2? Есть ли что-то, что просто предотвращает указанное изменение порядка? В вопросе просто сохраните порядок написания data[index] и index, другие записи вокруг них можно изменить. - person W.Sun; 04.11.2012
comment
@W.Sun: прочитайте этот пост stackoverflow.com/questions/8896092/, на самом деле в нем обсуждается в основном переупорядочивание компилятора, есть обходной путь для барьера адреса памяти, я не уверен, что это будет работать в В распределенной среде лучший способ — установить барьер хранилища для всех команд хранилища. все решения CAS допускают атомарное обновление, но не garentie order - person Michael; 04.11.2012