O std :: atomic deve ser volátil?
Estou executando um segmento que é executado até que um sinalizador seja definido.
std::atomic<bool> stop(false);
void f() {
while(!stop.load(std::memory_order_{relaxed,acquire})) {
do_the_job();
}
}
Gostaria de saber se o compilador pode desenrolar um loop como este (não quero que isso aconteça).
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
}
}
Dizem que volatilidade e atomicidade são ortogonais, mas estou um pouco confuso. O compilador está livre para armazenar em cache o valor da variável atômica e desenrolar o loop? Se o compilador puder desenrolar o loop, acho que tenho que colocarvolatile
para a bandeira, e eu quero ter certeza.
Devo colocarvolatile
?
Sinto muito por ser ambíguo. Eu (acho que eu) entendo o que é reordenar e o quememory_order_*
s significa, e eu tenho certeza que eu entendo perfeitamente o quevolatile
é.
Eu acho que owhile()
loop pode ser transformado como um infinitoif
declarações 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();
...
}
Como as ordens de memória fornecidas não impedem que as operações sequenciadas antes sejam movidas para além da carga atômica, acho que ela pode ser reorganizada se não for 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();
...
}
Se o atômico não implica volátil, acho que o código pode ser transformado dessa maneira na pior das hipóteses.
void f() {
if(stop.load(std::memory_order_{relaxed,acquire})) return;
while(true) {
do_the_job();
}
}
Nunca haverá uma implementação tão insana, mas acho que ainda é uma situação possível. Eu acho que a única maneira de evitar isso é colocarvolatile
para a variável atômica e estou perguntando sobre isso.
Há muitas suposições que eu fiz, por favor me diga se há algo errado entre elas.