Sto usando C++ std::atomic_flag
come una bandiera booleana atomica. Impostare il flag su true o false non è un problema, ma come interrogare lo stato corrente del flag senza impostarlo su un valore? So che esistono metodi "atomic_flag_clear
" e "atomic_flag_set
". Restituiscono lo stato precedente ma modificano anche lo stato corrente. C'è un modo per interrogare lo stato di flag senza modificarlo o devo usare full 'std::atomic<bool>
'.C++ atomic_flag query state
risposta
Non è possibile leggere il valore di std::atomic_flag
senza impostarlo su true
. Questo è di design. Non è una variabile booleana (abbiamo std::atomic<bool>
per quello), ma un flag minimo che è garantito senza blocco su tutte le architetture che supportano C++ 11.
Su alcune piattaforme le uniche istruzioni atomiche sono 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 esiste un'istruzione atomica per la lettura del valore.
Quindi, se si desidera leggere il valore senza modificarlo, è necessario std::atomic<bool>
.
volevo solo citare il tuo libro .... – haohaolee
Cosa succede se voglio stampare solo il suo valore per scopi di debug, quindi non mi interessa davvero che * questa * lettura particolare sia atomica? Ora uso l'elemento '.__ val' per quello, ma dà errore in alcune versioni di gcc (giustamente quindi suppongo) – user1273684
Non puoi leggere il valore di un' std :: atomic_flag' per qualsiasi scopo senza modificare esso. Se vuoi leggerlo (anche per il debug di printf), hai bisogno di 'std :: atomic
Se si desidera utilizzare atomic_flag
per determinare se un filo deve uscire, si può fare in questo modo:
inizializzazione:
std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();
ciclo Discussione:
while (keep_running.test_and_set()) {
// do thread stuff
}
Quando si vuoi uscire dal thread:
keep_running.clear();
- 1. JavaScript State State Machine
- 2. PostgreSQL come vedere quali query sono state eseguite
- 3. Quante righe sono state cancellate?
- 4. Differenze tra: init-state vs: state alla funzione build
- 5. Generate State Diagram Trascina/Rilascia
- 6. thread state java
- 7. Puma .state file
- 8. AngularJS: Reverse Checkbox State
- 9. UIButton State (UIControlState)
- 10. SimpleSAMLphp State Information smarrimento
- 11. Città Paese State Database
- 12. C# Parameterized Query MySQL con clausola `in`
- 13. Quali tabelle sono state interessate durante una singola query eseguita da trigger in cascata
- 14. Scopri quali funzioni sono state allineate
- 15. Gallery/AdapterView Child Drawable State
- 16. Unwrapping the Haskell State Monad
- 17. Angularjs Accordion Access isOpen State
- 18. Browser "Busy State" con Ajax
- 19. Il thread di inizializzazione statica std :: atomic_flag è sicuro in Visual Studio 2012?
- 20. SQL Server: perché non sono state trovate righe?
- 21. qual è la differenza tra l'utilizzo di ATOMIC_FLAG_INIT e std :: :: atomic_flag chiaro
- 22. Spinner Android con diversi layout per "drop down state" e "closed state"?
- 23. Le entità possono essere state modificate o eliminate dal momento che le entità sono state caricate
- 24. query WMI .NET valido
- 25. jquery ui buttons incoerente hover state
- 26. State Machine, Modello convalide e RSpec
- 27. Representational State Transfer (REST) in Common Lisp
- 28. sessioni PHP che sono già state iniziate
- 29. Web Api Sono state trovate più azioni
- 30. Sfarfallio di browser -webkit-animation-play-state
Sembrerebbe che il suo unico uso sia quello di acquisire un lucchetto. Potresti usare un 'std :: atomic_flag' come un blocco che potresti acquisire prima di accedere a una risorsa condivisa, ma se quella risorsa condivisa è solo un' bool', allora come hai detto, potresti anche usare 'std :: atomic '. _Modifica: _ o piuttosto std :: atomic_bool, visto come si sono dedicati al problema di specializzarne uno per te! –
Rook
Non è possibile conoscere lo stato corrente, a meno che non si usi la semantica acquisizione/rilascio corretta (ad esempio, provare a bloccarla con 'atomic_flag_set', e quindi fare solo cose se in realtà si è modificato il valore). Semplicemente leggerlo ti direbbe solo qual è il valore quando lo leggi, e potrebbe essere cambiato subito dopo. –
@ Mike: è davvero importante? Sembra che tutti gli OP desiderino sia la capacità di eseguire una lettura atomica e avere qualche nozione di letture e scritture ordinate. – Rook