Uruchomiłem wątek, który działa do momentu ustawienia flagi.Czy std :: atomic powinien być lotny?
std::atomic<bool> stop(false);
void f() {
while(!stop.load(std::memory_order_{relaxed,acquire})) {
do_the_job();
}
}
Zastanawiam się, czy kompilator może rozwinąć pętlę tak (nie chcę, by to się stało).
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
}
}
Mówi się, że zmienność i atomowość są ortogonalne, ale jestem nieco zdezorientowany. Czy kompilator może swobodnie buforować wartość zmiennej atomowej i rozwinąć pętlę? Jeśli kompilator może rozwinąć pętlę, to myślę, że muszę umieścić flagę na volatile
i chcę mieć pewność.
Czy powinienem wstawić volatile
?
Przykro mi z powodu niejednoznaczności. Ja (domyślam się, że ja) rozumiem, co to jest zmiana kolejności i co znaczy memory_order_*
i jestem pewien, że w pełni rozumiem, co to jest.
Myślę, że pętla while()
może zostać przekształcona jako nieskończone if
takie instrukcje.
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();
...
}
Ponieważ przyjmować zleceń pamięci nie uniemożliwiają zsekwencjonowany-przed operacje z przemieszczane obok ładunku atomowego, myślę, że to może być uporządkowane, czy to bez lotny.
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();
...
}
Jeśli atomowa nie oznacza lotny, to myślę, że kod może być nawet tak przekształcone w najgorszym przypadku.
void f() {
if(stop.load(std::memory_order_{relaxed,acquire})) return;
while(true) {
do_the_job();
}
}
Nigdy nie będzie tak szalony realizacji, ale myślę, że to jeszcze możliwe sytuacja. Myślę, że jedynym sposobem, aby temu zapobiec, jest umieszczenie volatile
na zmiennej atomowej i pytam o to.
Jest wiele domysłów, które zrobiłem, proszę powiedz mi, czy coś jest nie tak.
Nie sądzę. Ostatnio dużo oglądałem dla 'std :: atomic', ale nikt nie powiedział, że tak powinno być. Chyba w klasie jest "zmienna" zmienna gdzieś. – Nick
Możliwy duplikat [Współbieżność: Atomowa i lotna w modelu pamięci C++ 11] (http://stackoverflow.com/questions/8819095/concurrency-atomic-and-volatile-in-c11-memory-model) –
Nie, to nie powinno być niestabilne. –