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