¿Cuál es la diferencia en volátiles en C# yc? Me lo preguntaron en una entrevista.Diferencia en volátiles en C# y C
Respuesta
The article mentioned in this blog post por Herb Sutter explica las cosas de manera concisa y clara y compara el uso y el significado de volátiles en C, C++, Java y C#.
Hay un par de buenas preguntas y respuestas sobre este mismo sitio también:
- How to illustrate usage of volatile keyword in C#
- Usage of volatile specifier in C/C++/Java
- What is the “volatile” keyword used for?
- c++ volatile multithreading variables
- volatile and multithreading?
- Why is volatile needed in c?
EDITAR: para no confundir a nadie aquí es el "exact link" al artículo DDJ mencionado en el enlace inicial (que es un enlace al blog de Herb Sutter).
También this article por Nigel Jones explica la palabra clave volátil en el contexto de la programación C incrustada. Como esta pregunta parece haber aparecido en una entrevista this other article por el mismo autor es uno de mis favoritos ("exact link") y tiene otra buena explicación de la volatilidad en el mundo C.
En C volátil le dice al compilador que no optimizar el acceso a una variable:
int running = 1;
void run() {
while (running) {
// Do something, but 'running' is not used at all within the loop.
}
}
Normalmente, el compilador puede traducir 'mientras que (en ejecución)' en este caso simplemente 'while (1)'. Cuando la variable 'en ejecución' se marca como volátil, el compilador se ve obligado a verificar la variable cada vez.
Importante es comprender que para C 'volátil' solo se limita la optimización del compilador, mientras que su hardware (es decir, los cachés de la CPU, la línea de instrucciones, etc.) aún puede reordenar el acceso a la memoria. No hay forma de que su compilador C le diga a su hardware que no se optimice. Tienes que hacerlo tú mismo (por ejemplo, usando una barrera de memoria).
Por lo que yo sé (pero no estoy completamente seguro) C# especificación va un poco más lejos:
- Si se escribe a una variable volátil, se garantiza que todos los accesos a memoria que se hacer antes de que se complete.
- Si lee de una variable volátil, se garantiza que todos los accesos de memoria que realice después no se completen antes de que se complete la lectura de la variable volátil.
- 1. Uso de volátiles (Thread.VolatileRead/Thread.VolatileWrite) en C#
- 2. diferencia operador ++ i en C# y C++
- 3. C y C++ diferencia en sizeof ('x')
- 4. Diferencia entre C: y C:/
- 5. Diferencia entre estática en C y estática en C++ ??
- 6. ¿En qué se diferencia "const" en C y C++?
- 7. Objetivo C: ¿Cuál es la mejor forma de convertir volátiles en Java en Objective C?
- 8. Diferencia en el enlace entre C y C++?
- 9. diferencia entre sizeof y strlen en c
- 10. Diferencia entre read() y fgets() en C
- 11. ¿Diferencia entre sombreado y anulación en C#?
- 12. Diferencia entre "var" y "objeto" en C#
- 13. diferencia entre + y - métodos en Objective-C
- 14. Diferencia entre Convert.ToString() y .ToString() en C#?
- 15. Diferencia entre char * y char [] en C
- 16. Diferencia entre byte y char en C
- 17. Diferencia entre C++ administrado y C++
- 18. punteros void: diferencia entre C y C++
- 19. Establecer diferencia en C++
- 20. C# diferencia entre == y equals()
- 21. C++ - ¿Deberían los datos pasados a un hilo ser volátiles?
- 22. Usando C/Pthreads: ¿las variables compartidas deben ser volátiles?
- 23. Diferencia y definición de constantes literales y simbólicas en C?
- 24. Diferencia entre & (ampersand) y && or | (tubería) y || en Objective-C?
- 25. C# ThreadStatic + miembros volátiles que no funcionan como se esperaba
- 26. Diferencia entre rendimiento en Python y rendimiento en C#
- 27. PostgreSQL expresiones volátiles y subconsultas
- 28. ¿Cuál es la diferencia entre <C-C> y <C-[> en vim?
- 29. Las variables estáticas en C y C++
- 30. Diferencia entre las clases parciales C# y Objective C?
siguiendo su enlace no pude entender la diferencia –
@Luis Filipe ¿qué es exactamente lo que no entendió? Solo para resumir lo que presenta el artículo: en Java/.NET (C#) volátil se usa para programación sin bloqueo mientras que en C/C++ se usa para "Semántica de memoria inusual" (describiendo registros HW, memoria en más de una dirección) – celavek
Usted tiene que seguir hasta el artículo real ddj. No sé si eso es fácil de vincular a (anuncios). –