Когда я читаю ldd3, я понимаю концепцию барьера памяти, говорят, что выполнение кода будет переупорядочено по той причине, что оптимизация кеширования и компиляции. Я думаю, что коды, которые не имеют зависимостей, могут быть переупорядочены для получения лучшего результата, а регистры портов ввода-вывода не могут быть оптимизированы, поскольку в нем должны содержаться согласованные данные. Но я не могу понять этот код ниже, и есть ли какие-то правила, чтобы следовать, куда мне следует вставлять функции, такие как smb(), mb(), барьер()?Как я могу судить, где я должен помещать барьер памяти в код?
Например, в примере код short от ldd3.
/*
* Atomicly increment an index into short_buffer
*/
static inline void short_incr_bp(volatile unsigned long *index, int delta)
{
unsigned long new = *index + delta;
barrier(); /* Don't optimize these two together */
*index = (new >= (short_buffer + PAGE_SIZE)) ? short_buffer : new;
}
Как линия перед барьером и линия после переустановки барьера? Я думаю, что последнее зависит от того, чтобы первое было выполнено первым, чтобы получить новое значение. Это действительно меня смущает.
Мой ответ в http://stackoverflow.com/questions/20446982/determining-the-location-for-theage-of-barriers-fences/20476292 описывает некоторые общие закономерности, на которые следует обратить внимание. Потому что они требуют памяти барьеры. –