Estoy usando C++ std::atomic_flag
como indicador booleano atómico. Establecer el indicador en verdadero o falso no es un problema, sino cómo consultar el estado actual del indicador sin establecerlo en algún valor. Sé que hay métodos 'atomic_flag_clear
' y 'atomic_flag_set
'. Devuelven el estado anterior pero también modifican el estado actual. ¿Hay alguna manera de consultar el estado de la bandera sin modificarlo o tengo que usar el pleno derecho 'std::atomic<bool>
'.C++ estado de consulta atomic_flag
Respuesta
No puede leer el valor de std::atomic_flag
sin establecerlo en true
. Esto es por diseño. No es una variable booleana (tenemos std::atomic<bool>
para eso), pero una bandera mínima que se garantiza libre de bloqueo en todas las arquitecturas que admiten C++ 11.
En algunas plataformas las únicas instrucciones atómicas son instrucciones de intercambio. En dichas plataformas, std::atomic_flag::test_and_set()
se puede implementar con exchange var,1
y clear()
con exchange var,0
, pero no hay instrucciones atómicas para leer el valor.
Por lo tanto, si quiere leer el valor sin cambiarlo, entonces necesita std::atomic<bool>
.
solo quería citar su libro .... – haohaolee
¿Qué pasa si solo quiero imprimir su valor para fines de depuración, así que realmente no me importa que * esta * lectura en particular sea atómica? Ahora uso el elemento '.__ val' para eso, pero da un error en algunas versiones de gcc (con razón, supongo) – user1273684
No se puede leer legítimamente el valor de un' std :: atomic_flag' para ningún propósito sin modificar eso. Si quieres leerlo (incluso para la depuración de printf), necesitas 'std :: atomic
Si desea utilizar atomic_flag
para determinar si un hilo debe salir, puede hacerlo de esta manera:
inicialización:
std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();
bucle del hilo:
while (keep_running.test_and_set()) {
// do thread stuff
}
Cuando quiere que el hilo salga:
keep_running.clear();
- 1. estado de replicación de MySQL usando una consulta de selección
- 2. Consulta un proceso de Erlang para su estado?
- 3. Generador de máquinas de estado C++
- 4. MongoDB C# Conductor consulta
- 5. ¿C# incluye máquinas de estado finito?
- 6. Barra de estado en C# Windows Forms
- 7. Diseñando una máquina de estado en C++
- 8. C# PrintDocument y estado de la impresora
- 9. C# compruebe el estado de la impresora
- 10. ¿Integración de estado de Erlang y C/C++?
- 11. C# ASP.NET cadena de consulta analizador
- 12. Parse REST consulta en C++
- 13. Métodos estáticos sin estado vs. funciones C en Objective-C
- 14. SOLR filtro de consulta vs principal-consulta
- 15. Estado de jQuery TestSwarm?
- 16. Estado de soporte de Clang 3.1 y C++ 11
- 17. Cómo obtener un estado de una consulta en ejecución en la base de datos postgresql
- 18. Android: mostrar/ocultar la barra de estado/barra de estado
- 19. LINQ consulta
- 20. "estado persistente" vs. "estado actual"
- 21. C# Servicio de estado en la máquina remota
- 22. Detectando el estado de la red (conectado - desconectado) en C#
- 23. ¿Cuál es el estado actual de BDD en C++?
- 24. Crear diagramas de estado en Visio usando C#
- 25. C++ Qt: compruebe el estado actual de QStateMachine
- 26. Cómo obtener el estado del trabajo de impresión con C#
- 27. Comprobación del estado de un proceso secundario en C++
- 28. ¿Cuál es el estado de los rangos en C++?
- 29. FST (transductores de estado finito) Bibliotecas, C++ o java
- 30. C++ inicialización estática de la clase sin estado
Parece que su único uso es ser un medio para adquirir un candado. Podrías usar un 'std :: atomic_flag' como un bloqueo que podrías adquirir antes de acceder a un recurso compartido, pero si ese recurso compartido es solo un' bool' entonces como dijiste, también podrías usar 'std :: atomic '. _Editar: _ o más bien std :: atomic_bool, ¡ya que se han tomado la molestia de especializar uno para ti! –
Rook
No puede conocer el estado actual, a menos que use la semántica de adquisición/liberación correcta (es decir, intente bloquearlo con 'atomic_flag_set', y luego solo haga las cosas si realmente cambió el valor). Simplemente leerlo solo le diría cuál era el valor cuando lo leyó, y podría haber cambiado inmediatamente después. –
@Mike: ¿eso realmente importa? Parece que todo lo que OP desea es la capacidad de realizar una lectura atómica y tener alguna noción de lecturas y escrituras ordenadas. – Rook