pass data c# c volatile

pass data between forms c#



Variables volátiles (2)

Respondí diciendo que solo le permite al compilador saber que la variable se puede usar en procesos o subprocesos, y que no debería usar la optimización en esa variable; Como optimizarlo puede deteriorarse el comportamiento. En pocas palabras, es una advertencia para el compilador.

Esto va en la dirección correcta para C # pero pierde algunos aspectos importantes.

En primer lugar, eliminar "procesos" por completo. Las variables no se comparten entre procesos en C #.

Segundo, no te concentres en las optimizaciones . En su lugar, concentrarse en la semántica permisible . No se requiere un compilador para generar código óptimo; se requiere un compilador para generar código que cumpla con las especificaciones. Un pedido no tiene que ser por razones de rendimiento y no es más rápido / más pequeño / lo que sea. Una declaración volátil agrega una restricción adicional a la semántica permisible de un programa de multiproceso.

Tercero, no pienses en esto como una advertencia para el compilador. Es una directiva para el compilador: generar código que garantice que cumple con la especificación para variables volátiles. Cómo lo hace el compilador depende de ello.

La respuesta real a la pregunta.

¿Me puede describir qué hace la adición de volátiles frente a las variables?

es: el compilador de AC # y el entorno de ejecución tienen una gran libertad para reordenar las lecturas y escrituras de variables por cualquier motivo que consideren adecuado. Están restringidos solo a aquellos reordenamientos que preservan el significado de los programas en un solo hilo. Entonces "x = y; a = b;" podría mover la lectura de b antes de la lectura a y; Eso es legal porque el resultado no ha cambiado. (Esta no es la única restricción para reordenar, pero en cierto sentido es la más fundamental). Sin embargo, se permite que los reordenes se noten en varios subprocesos; es posible que otro hilo observe que b se lee antes que y. Esto puede causar problemas.

El compilador y el tiempo de ejecución de C # tienen restricciones adicionales sobre cómo las lecturas y escrituras volátiles se pueden reordenar una con respecto a la otra y, además, cómo se pueden ordenar con respecto a otros eventos, como el inicio y la detención de hilos, los bloqueos, las excepciones que se lanzan, y así.

Consulte la especificación de C # para obtener una lista detallada de las restricciones sobre ordenamientos observados de lecturas, escrituras y otros efectos.

Tenga en cuenta, en particular, que incluso con variables volátiles, no se requiere que haya un orden total consistente de todos los accesos de variables como se ve desde todos los subprocesos . Y específicamente, la noción de que volátil "lee el último valor de la variable" es simplemente falsa; esa redacción sugiere que existe tal cosa como "el último valor", lo que implica un ordenamiento total y consistente.

Si eso suena confuso, lo es. No escriba programas de multiproceso que compartan datos a través de subprocesos. Si es necesario, utilice las abstracciones de más alto nivel a su disposición. Casi nadie debería estar escribiendo código que use volátil; Usa el TPL y deja que administre tus hilos.

Ahora consideremos tu respuesta en el contexto de C.

La pregunta está mal planteada con respecto a C. En C #, volatile es un modificador en las declaraciones de variables miembro; en C, es parte de un tipo . Así que decir "antes de una variable" es ambiguo; donde antes de la variable Hay una diferencia entre un volatile int * x y un int * volatile x . (¿Puedes ver la diferencia?)

Pero lo que es más importante: la especificación de C no garantiza que la volatilidad tendrá ningún comportamiento en particular con respecto a los hilos. Si su compilador de C lo hace, esa es una extensión del lenguaje de su proveedor del compilador. Se garantiza que la volatilidad en C tiene cierto comportamiento con respecto a la IO asignada en memoria, saltos largos y señales, y eso es todo; Si confía en que tenga cierto comportamiento con respecto a los hilos, entonces está escribiendo código no portátil.

Según el entrevistador: es al revés, y la palabra clave volátil advierte al sistema operativo, no al compilador.

Eso es una tontería de principio a fin. Los entrevistadores no deben hacer preguntas a las que no entienden las respuestas.

Recientemente tuve una entrevista con una compañía de software que me hizo la siguiente pregunta:

¿Me puede describir qué hace la adición de volátiles frente a las variables? ¿Puedes explicarme por qué es importante?

La mayor parte de mi conocimiento de programación proviene de C, pero el puesto de trabajo es para C # (pensé que podría agregar este bit de información si fuera necesario para la pregunta específica)

Respondí diciendo que solo le permite al compilador saber que la variable se puede usar en procesos o subprocesos, y que no debería usar la optimización en esa variable; Como optimizarlo puede deteriorarse el comportamiento. En pocas palabras, es una advertencia para el compilador.

Sin embargo, según el entrevistador, es al revés, y la palabra clave volátil advierte al sistema operativo , no al compilador.

Estaba un poco confundido por esto, ¡así que hice una investigación y encontré respuestas conflictivas! Algunas fuentes dicen que es para el compilador, y otras para el sistema operativo.

Cual es ¿Se diferencia por idioma?


Para ser honesto, la pregunta planteada por el entrevistador es algo confusa.

Realmente depende de lo que él / ella quiso decir con "OS". ¿Están hablando sobre el "sistema operativo por adelantado", el lado de software puro de las cosas, o lo que podrían estar interpretando erróneamente en el "sistema operativo" como la relación hardware-software, es decir, el RTE y el MMM? (He visto suposiciones y comparaciones en algunos de mis entrevistas personales). ¡Pienso que se debe tener en cuenta que estos dos son bastante diferentes! Si él / ella está hablando de lo primero, NO volátil no "informa" al sistema operativo. Si están hablando de esto último, entonces (esto es un sí flojo). En este punto, usted está en el reino de las diferencias entre los idiomas. Como mencionó Cody Gray, C # es un lenguaje administrado, por lo que la última definición del sistema operativo "notifica" la variable y las precauciones a tomar.

Pero también, en cualquier caso o definición de SO, el compilador gestiona y trata especialmente el campo volátil, independientemente del idioma. De lo contrario, ¿por qué tener la palabra clave en primer lugar?

En mi opinión personal, lo que sea que valga la pena, creo que respondió correctamente, aunque, a juzgar por los comentarios, puede ser complicado y agitado por naturaleza.