¿Qué sucede cuando dos hilos establecen un BOOL en YES "al mismo tiempo"?¿BOOL es de lectura/escritura atómica en el Objetivo C?
Respuesta
No. Sin una construcción de bloqueo, leer/escribir cualquier variable tipo no es atómica en Objective C.
Si dos hilos Escritura SI al mismo tiempo a un BOOL, el resultado es SI, independientemente de cuál se en primer.
favor ver: Synchronizing Thread Execution
Gracias, Mitch. Si uno ead lo establece en SÍ mientras que otro lo establece en NO, ¿puede haber corrupción de memoria? – Jacko
http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html ofrece una discusión muy detallada. Creo que usaré un int en lugar de un BOOL, y usaré las operaciones OSAtomic en este int. – Jacko
La implicación de su pregunta es si puede que se rompa algún otro trozo de memoria. No; eso no puede suceder Lo peor que sucederá es que leerá un NO aparentemente después de que escribió un SÍ en otro hilo. – bbum
Aquí es código para solución sugerida por Jacko.
Uso volatile
uint32_t
con OSAtomicOr32Barrier
y OSAtomicAnd32Barrier
#import <libkern/OSAtomic.h>
volatile uint32_t _IsRunning;
- (BOOL)isRunning {
return _IsRunning != 0;
}
- (void)setIsRunning:(BOOL)allowed {
if (allowed) {
OSAtomicOr32Barrier(1, & _IsRunning); //Atomic bitwise OR of two 32-bit values with barrier
} else {
OSAtomicAnd32Barrier(0, & _IsRunning); //Atomic bitwise AND of two 32-bit values with barrier.
}
}
Cool! Pero ¿por qué no usar 'OSAtomicOr32Barrier (allowed, & _IsRunning);' en lugar de condicional? –
Sí, puede usar. –
Ah, no es tan simple, lo siento. No puede usar la versión "o" para restablecer el indicador, es decir, debe usar la versión "y" para hacer esto (OSAtomicAnd32Barrier). –
tendría que divergen de la respuesta aceptada. Lo siento. Si bien el objetivo c no garantiza que las propiedades BOOL declaradas como no atómicas sean atómicas, tendría que adivinar que el hardware que más importa es el de (todos los dispositivos iOS y macos) tienen instrucciones para realizar lecturas de bytes y almacenar atómicamente. Entonces, a menos que Apple salga con Road Light OS ejecutando en un microcontrolador IBM que tenga un bus ancho de 5 bits para enviar bytes de 10 bits en , podría usar BOOLs no atómicos en una situación que requiera BOOLs atómicos. El código no sería portátil para Road Light OS, pero si puede sacrificar la futura protección de su código no atómico está bien para este caso de uso. Estoy seguro de que hay individuos endurecidos a la vez eso plantearía el desafío de desensamblar el eliminador BOOL sintetizado y el colocador para casos atómicos/no atómicos para ver cuál es la diferencia. Al menos en ARM.
Su comida para llevar de esto es probable que este
- puede declarar propiedades BOOL como atómica y que no le costará un centavo sobre todo IOS HW y MacOS apoya intrínsecamente.
- barreras de memoria son ortogonales a la atomicidad
- que definitivamente no debe usar 4 bytes para almacenar propiedades booleanos en a menos que esté en la lógica [muy] difusa. Es estúpido y derrochador, no desea ser un clon de un programador de Java, que no puede distinguir un carro de un doble, ¿o sí?
- las variables BOOL (que no obviamente apoyan decoradores atómicas/no atómica no sería atómica en algunas arquitecturas de bus estrechas C objetivo sería no puede utilizar de todos modos (microcontroladores con o sin alguna OS [muy] micro son C territorio & ensamblaje supongo. que por lo general no necesitan el equipaje tiempo de ejecución objc traería)
- 1. Objetivo-C: BOOL vs bool
- 2. cómo imprimir bool en el objetivo c
- 3. BOOL envoltura? Haz un objeto de valor 'BOOL'. (Objetivo-C)
- 4. Cómo usar la variable estática (BOOL) en el Objetivo C
- 5. Es una operación atómica suficiente
- 6. ¿Qué es "->" en el Objetivo C?
- 7. ¿Qué es dealloc en el objetivo C
- 8. ¿La asignación de puntero es atómica en C++?
- 9. Ajuste del objetivo C en el objetivo C++/C++
- 10. ¿Cómo creo una variable de instancia BOOL en el objetivo c?
- 11. ¿Cuál es el significado de #define en el objetivo C?
- 12. ¿Cuál es el significado de "mutable" en el objetivo C?
- 13. en C# ¿Qué significa 'bool = bool! = True'?
- 14. Caret en el objetivo C
- 15. Selectores en el objetivo C
- 16. ¿MERGE es una declaración atómica en SQL2008?
- 17. ¿Es segura la implementación de C++ para una flotación atómica?
- 18. Constante en objetivo-c
- 19. ¿Es posible la sobrecarga de funciones en el objetivo C?
- 20. pi en el objetivo C
- 21. constructor en el objetivo c
- 22. __OBJC__ en el objetivo C
- 23. epub en el objetivo c
- 24. Compilar C# en el objetivo-C
- 25. lo hace tiene sentido hacer atómica una bandera BOOL en múltiples hilos de programación
- 26. Es !! una forma segura de convertir a bool en C++?
- 27. Objetivo XOR-c
- 28. ¿Qué es NSBundle y mainBundle en el objetivo C?
- 29. Devolución de errores en el objetivo-c
- 30. ¿Cuándo deberían usarse BOOL y bool en C++?
se abre un agujero de gusano a otra dimensión. – dreamlax
Si los dos están poniéndolo a 'YES', no puede haber un problema si la escritura es atómica o no, ¿puede? –
@CarlNorum que podría ser cierto, pero no es obvio para mí por qué –