¿Debería std :: atomic ser volátil?

Estoy ejecutando un hilo que se ejecuta hasta que se establece una bandera.

std::atomic<bool> stop(false);

void f() {
  while(!stop.load(std::memory_order_{relaxed,acquire})) {
    do_the_job();
  }
}

Me pregunto si el compilador puede desenrollar un bucle como este (no quiero que suceda).

void f() {
  while(!stop.load(std::memory_order_{relaxed,acquire})) {
    do_the_job();
    do_the_job();
    do_the_job();
    do_the_job();
    ... // unroll as many as the compiler wants
  }
}

Se dice que la volatilidad y la atomicidad son ortogonales, pero estoy un poco confundido. ¿El compilador es libre de almacenar en caché el valor de la variable atómica y desenrollar el bucle? Si el compilador puede desenrollar el ciclo, entonces creo que tengo que ponervolatile a la bandera, y quiero estar seguro.

Debería ponervolatile?

Perdón por ser ambiguo. Yo (supongo que entiendo) qué es reordenar y quémemory_order_*s malo, y estoy seguro de que entiendo completamente lo quevolatile es.

Pienso que elwhile() el bucle puede transformarse como un infinitoif declaraciones como esta.

void f() {
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  do_the_job();
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  do_the_job();
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  do_the_job();
  ...
}

Dado que las órdenes de memoria dadas no impiden que las operaciones secuenciadas antes pasen de la carga atómica, creo que se puede reorganizar si no es volátil.

void f() {
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  if(stop.load(std::memory_order_{relaxed,acquire})) return;
  ...
  do_the_job();
  do_the_job();
  do_the_job();
  ...
}

Si el atómico no implica volátil, entonces creo que el código puede incluso transformarse así en el peor de los casos.

void f() {
  if(stop.load(std::memory_order_{relaxed,acquire})) return;

  while(true) {
    do_the_job();
  }
}

Nunca habrá una implementación tan loca, pero supongo que todavía es una situación posible. Creo que la única forma de evitar esto es ponervolatile a la variable atómica y estoy preguntando al respecto.

Hice muchas conjeturas, por favor dígame si hay algo mal entre ellas.

Respuestas a la pregunta(2)

Su respuesta a la pregunta