¿Condición de carrera al acceder a miembros adyacentes en una estructura compartida, de acuerdo con la regla de codificación CERT POS49-C?
De acuerdo aRegla de codificación CERT POS49-C Es posible que diferentes hilos que acceden a diferentes campos de la misma estructura puedan entrar en conflicto.
En lugar de campo de bits, uso int sin signo regular.
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;
}
Puedo ver que incluso sin firmar int, todavía puede haber una condición de carrera SI el compilador decide usar cargar / almacenar 8 bytes en lugar de 4 bytes. Creo que el compilador nunca hará eso y las condiciones de carrera nunca sucederán aquí, pero eso es solo una suposición.
¿Existe alguna documentación bien definida de ensamblador / compilador con respecto a este caso? Espero que el bloqueo, que es costoso, sea el último recurso cuando esta situación sea indefinida.
FYI, yo uso gcc.