Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

174
Vistas
¿Leer y escribir en valores dobles en caja seguros para subprocesos sin bloqueo?

Desde las palabras de MS, las lecturas y escrituras (junto con otras operaciones) hasta los dobles no son atómicos y, por lo tanto, no son seguros para subprocesos. Quería ver si puedo hacer que las lecturas y escrituras en subprocesos dobles sean seguras encuadrando los valores dobles y haciendo que la referencia al valor encuadrado sea volátil. A continuación hay una clase que demuestra mi uso de dobles en caja en un hilo trabajado y de consumo:

 public class Program { public volatile static object objCounter; public static AutoResetEvent Finish = new AutoResetEvent(false); static void Main(string[] args) { // Worker thread that writes to the boxed double values Task.Run(() => { double dCounter = 0d; while (!Finish.WaitOne(100, false)) { dCounter += 1.5d; // Box dCounter into objCounter - // Copy double value to new location on the heap // and point the objCounter to this location on the heap objCounter = (object)dCounter; } }); // Consumer thread that reads the boxed double values for (int index = 0; index < 50; index++) { Console.WriteLine(String.Format("Double counter value = {0}",objCounter)); Thread.Sleep(100); } Finish.Set(); } }

Creo que el código anterior es seguro para subprocesos por las siguientes razones:

  1. Cuando el subproceso de trabajo escribe el doble en objCounter , debe crear una nueva ubicación en el montón, copiar el valor doble en esa nueva ubicación en el montón y luego copiar atómicamente la referencia a la nueva ubicación del montón en objCounter . Se garantiza que esta copia atómica de la referencia (puntero) a objCounter es atómica directamente desde la boca de MS: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/variables #96-atomicity-of-variable-references – (Consulte 9.6 Atomicity of variable references) Es importante tener en cuenta que se crea una nueva ubicación en el montón cada vez que encuadramos el doble, si no creamos una nueva ubicación en el montón que esto no sería seguro para subprocesos.

  2. Dado que objCounter es volátil, no habría problemas de visibilidad de memoria entre los subprocesos de trabajo y de consumidor de la referencia que apunta a la ubicación de memoria en el montón que contiene el valor doble actual.

¿Estoy en lo correcto al suponer que mi uso de dobles en caja en un subproceso de trabajador y consumidor como se especificó anteriormente es seguro para subprocesos?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Sí, su código es seguro para subprocesos. Dado que objCounter es un campo volatile , las dos líneas a continuación:

 objCounter = (object)dCounter; Console.WriteLine(objCounter);

... son equivalentes a aquellos:

 Volatile.Write(ref objCounter, (object)dCounter); Console.WriteLine(Volatile.Read(ref objCounter));

Ambos métodos Volatile crean barreras de memoria. Volatile.Write asegura que el procesador no moverá las instrucciones asociadas con la creación de la instancia de objCounter , después de esta llamada. Y Volatile.Read asegura que el procesador no moverá las instrucciones asociadas con la visualización del objCounter en la consola, antes de esta llamada. Entonces, el hilo que muestra objCounter siempre verá una instancia completamente inicializada.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda