2012-04-10 15 views
5

Estaba debatiendo con un amigo que afirma que el constructor estático podría dar paso a una condición de carrera ya que el constructor estático podría ser llamado varias veces. Parece que esto solo podría suceder en entornos de múltiples subprocesos de alto volumen. ¿Es eso posible?Condición de carrera en C# constructor estático

No pude encontrar ninguna documentación para demostrar que estaba equivocado. ¿Alguien tiene alguna idea sobre esto?

Gracias!

+0

La condición de carrera viene si un nuevo hilo hace algo que activaría el constructor estático mientras que el constructor estático ya se está ejecutando en otro hilo. El hilo se bloqueará hasta que el constructor estático termine de ejecutarse. Pero el constructor estático podría estar esperando que se complete ese nuevo hilo. Ver http://stackoverflow.com/a/8883117/385844 – phoog

Respuesta

3

El constructor estático se llama solo una vez por Dominio de aplicación.
ECMA-335 indica que la CLI garantizará que:

"Un tipo de inicialización se ejecutan una sola vez para cualquier tipo dado, a menos llama explícitamente por código de usuario."

Y no he oído hablar de una forma conveniente de llamar a los tipos de inicializadores en C#.

Solo podría tener problemas si crea dependencias circulares entre los inicializadores de Tipo.
Vea aquí un interesante artículo sobre ese tema:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx)

+0

¡Perfecto! Gracias por la ayuda. – webber

+0

Debe saber que la Lista y la Lista son dos tipos diferentes. Por lo tanto, el constructor estático de la lista se llamará dos veces, por ejemplo. –

+2

@AenSidhe Debido a que son tipos diferentes, no es el mismo constructor estático. Una vez que aplica un argumento de tipo como int o string a List , se crea un tipo cerrado. Los diferentes tipos también tienen cada uno su propio conjunto de variables estáticas. No se llamará al constructor estático de la lista de tipo abierto . Consulte la sección 4.4.2 de la [especificación C#] (http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc) para obtener más información. información – Botz3000

12

¿Eso es posible?

No. El CLR maneja esto para usted y evita que los constructores estáticos se llamen más de una vez.

Esto se explica varias veces en la especificación del lenguaje C#. Por ejemplo, la sección 3.1 establece:

un constructor estático para un tipo se ejecuta como máximo una vez por cada dominio de aplicación.

+1

Esto es incorrecto. Eric da un ejemplo de cómo aquí: http://stackoverflow.com/a/9792537/351385 – Tergiver

+3

@Tergiver Me dirigía a la declaración del OP "podría dar paso a una condición de carrera ya que el constructor estático podría llamarse varias veces" - siempre es posible crear su propia condición de carrera, en cualquier código, en cualquier lugar. No hay garantías de seguridad de subprocesos, pero la especificación SÍ proporciona una garantía de que el constructor estático solo se invocará una vez, por lo que * ese potencial de condición de raza * específico no existe. –

+1

Pero la pregunta es, "¿Es posible que un cctor sea llamado varias veces?" La respuesta es: "Sí, es * posible *". Solo es posible si inicia la llamada desde el propio cctor, pero de hecho es posible. – Tergiver

Cuestiones relacionadas