La variable local, global o compartida en la red puede causar condiciones de carrera

Actualizado el Dec 26, 2019

Reportado en

Software

  • LabVIEW

Detalles del problema

  • Tengo dos ciclos while independientes que se ejecutan en paralelo. El primer ciclo while es para adquirir datos y almacenarlos en una variable local, global o compartida. El segundo ciclo es para leer periódicamente los datos de una variable local, global o compartida. La mayoría de las veces, todo funciona sin problemas, pero a veces pierdo datos y la variable se vacía.
  • Tengo una variable compartida de red (en inglés) que se usa en la computadora host, mientras que otras computadoras leen la variable y ocasionalmente ven resultados inesperados.

Solución

Las colas (queues) implementadas en una arquitectura de Productor / Consumidor se usan más comúnmente para evitar la necesidad o el desbordamiento de datos. El uso de una arquitectura de Productor / Consumidor proporciona una ventaja de sincronización porque el ciclo del Consumidor solo se ejecuta cuando hay datos disponibles en la cola (queue).

Otra alternativa es usar Semáforos (en inglés) o Variables globales funcionales (en inglés) que bloquean efectivamente el recurso variable mientras escribe en él.

Información adicional

¿Qué causa esto?

El uso de dos o más ciclos paralelos para escribir y leer desde la misma variable o intentar acceder a una Variable compartida de red mientras se escribe un valor en ella, puede provocar una condición de carrera en los siguientes escenarios:

  • Un ciclo está leyendo el valor de una variable local, global o compartida, y otro está escribiendo en el valor de la variable local, global o compartida. Si no están sincronizados, entonces el valor podría leerse antes de que se haya enviado realmente o viceversa.
  • Una computadora está escribiendo datos en la Variable compartida de red y otras computadoras intentan acceder al valor al mismo tiempo.