¿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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta