Stato della query atomic_flag in C++

Stato della query atomic_flag in C++

Non puoi leggere il valore di un std::atomic_flag senza impostarlo su true . Questo è di progettazione. Non è una variabile booleana (abbiamo std::atomic<bool> per quello), ma un flag minimo garantito senza blocco su tutte le architetture che supportano C++11.

Su alcune piattaforme le uniche istruzioni atomiche sono le istruzioni di scambio. Su tali piattaforme, std::atomic_flag::test_and_set() può essere implementato con exchange var,1 e clear() con exchange var,0 , ma non ci sono istruzioni atomiche per leggere il valore.

Quindi, se vuoi leggere il valore senza cambiarlo, allora hai bisogno di std::atomic<bool> .


Se vuoi usare atomic_flag per determinare se un thread deve uscire, puoi farlo in questo modo:

Inizializzazione:

std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();

Anello di filo:

while (keep_running.test_and_set()) {
    // do thread stuff
}

Quando vuoi che il thread esca:

keep_running.clear();