Tengo una variable que estoy utilizando para representar el estado. Se puede leer y escribir desde múltiples hilos.Enclavado y volátil
Estoy usando Interlocked.Exchange
y Interlocked.CompareExchange
para cambiarlo. Sin embargo, lo estoy leyendo de múltiples hilos.
Sé que volatile
se puede utilizar para asegurarse de que la variable no se almacena en la memoria caché localmente, sino que siempre se lee directamente desde la memoria.
Sin embargo, si configuro la variable en volátil, genera una advertencia sobre el uso de volátiles y pasa usando ref a los métodos de enclavamiento.
Quiero asegurarme de que cada hilo esté leyendo el valor más reciente de la variable y no una versión en caché, pero no puedo usar la palabra volátil.
Hay un Interlocked.Read
pero es para tipos de 64 bits y no está disponible en el marco compacto. La documentación para él dice que no es necesario para tipos de 32 bits, ya que se realizan en una sola operación.
Se han realizado declaraciones en Internet que no requieren volatilidad si está utilizando los métodos Interbloqueados para todos sus accesos. Sin embargo, no puede leer una variable de 32 bits con los métodos de enclavamiento, por lo que no hay forma de que pueda usar métodos enclavados para todo su acceso.
¿Hay alguna manera de lograr el hilo de lectura segura y escribir de mi variable sin usar el bloqueo?
Buena pregunta en realidad. El uso de un bloqueo regular implica un * punto de ejecución crítico * y garantiza que su valor estará actualizado para todos los hilos. Sin embargo, Interlocked.Exchange no se implementa con 'lock' y no puedo encontrar ninguna referencia que haga tales garantías. – Thorarin