как можно больше друг от друга в кеше, чтобы они не вызывали сброс кеша в многопроцессорных ситуациях
сно сCERT правило кодирования POS49-C Возможно, что разные потоки, обращающиеся к разным полям одной и той же структуры, могут конфликтовать.
Вместо битового поля я использую обычный unsigned int.
struct multi_threaded_flags {
unsigned int flag1;
unsigned int flag2;
};
struct multi_threaded_flags flags;
void thread1(void) {
flags.flag1 = 1;
}
void thread2(void) {
flags.flag2 = 2;
}
Я вижу, что даже для unsigned int все еще может быть состояние гонки, если компилятор решит использовать загрузку / хранение 8 байтов вместо 4 байтов. Я думаю, что компилятор никогда не сделает этого, и условия гонок здесь никогда не произойдут, но это только мое предположение.
Есть ли какая-либо четко определенная документация по сборке / компилятору в этом случае? Я надеюсь, что блокировка, которая является дорогостоящей, является последним средством, когда эта ситуация оказывается неопределенной.
К вашему сведению, я использую GCC.