2009-03-18 15 views
5

En .NET ¿cómo puedo saber si una clase o método es seguro para subprocesos o no? ¿Por defecto no es seguro para subprocesos?¿Existe un atributo para marcar la clase o el método para que sea seguro para subprocesos en .NET?

+0

¿Qué propósito le gustaría que sirviera dicho atributo? – AnthonyWJones

+1

Puede ser un tipo de documentación de código para advertir al usuario de clase –

+0

Si solo quiere documentación, podría ponerla en la sección . –

Respuesta

6

Esto no es un atributo para esto: tiene que leer la documentación de cada elemento que le interese. No puede hacer que un hilo sea seguro simplemente añadiéndole un atributo. Es como tomar una naranja y ponerle una pegatina que diga "Apple".

Por supuesto, lo mismo es cierto para la serialización y no los detuvo allí, pero aún así: ningún atributo. Lee los documentos.

+0

Se supone que todos los métodos y propiedades estáticos son seguros para subprocesos (es decir, a menos que se indique lo contrario), por ejemplo, métodos es que no lo son. – Richard

+0

Suponiendo que un método no es seguro para subprocesos cuando no causa ningún daño, suponiendo que uno es seguro para subprocesos cuando no puede ser desagradable. Será mejor que suponga que nada es seguro para subprocesos a menos que se indique. – JoshBerke

1

Le di la espalda a Joel Coehoorn en este caso, sería fácil 'falsificar' tales afirmaciones.

Por qué no añadir el texto multi-hilo en la descripción de la función

+0

No me preocuparía tanto por "fingirlo". Pero la concurrencia es difícil: es muy probable que se haya producido un error y ese atributo sea incorrecto. –

+2

Pero si el atributo es incorrecto, es probable que la documentación (si la hay) sea igual de incorrecta. –

+0

Estoy totalmente de acuerdo con @JimMischel, pero Joel no fue quien abogó por la documentación. Al menos los atributos son legibles por máquina, lo que permite, como mínimo, la enumeración automatizada, el filtrado, la generación de informes, etc. de los métodos atribuidos, y posiblemente incluso algunas formas débiles de análisis estático y/o prevención de errores.Los atributos son el camino a seguir, pero necesitaría un sistema elaborado y completo de ellos para capturar la semántica de simultaneidad de una manera realmente útil. Para .NET, no conozco ningún diseño o propuesta de este tipo. –

-1

No hay ningún caso utilice el escenario de hacer una clase sincronizado, en lo que se refiere a método que se utiliza siguiendo el estilo de codificación:

using System.Runtime.CompilerServices; 
[MethodImpl(MethodImplOptions.Synchronized)] 
void MyMethod() 
{ 
DoSomething(); 
} 
+0

El problema es; eso todavía no implica que el método sea seguro para la ejecución de subprocesos, ya que otro subproceso podría estar llamando a un método diferente que * no * tenga el [MethodImpl], por lo que se descartarán entre sí. Del mismo modo, incluso si todos los campos son de solo lectura, los campos en los objetos secundarios podrían ser mutables y causar problemas. –

+0

Incluso si este llamado "estilo de codificación" * podría * significar algo (vea numerosos otros comentarios en esta página), la bandera 'MethodImplOptions.Synchronized' tiene el significado opuesto de lo que busca el OP. Este indicador indica que el método es ** no ** seguro para subprocesos. De la documentación: "El método se puede ejecutar con solo un hilo a la vez". –

1

Se es posible hacer todos los accesos a su serie de objeto a través de IContributeObjectSink/IContextAttribute aunque esto sufrirá un gran golpe de rendimiento ya que requerirá su objeto a la subclase MarshalByRefObject, sobrecarga de creación de contexto, etc ...

1

No, y sería inútil.

Asumamos que tengo una lista segura hilo, que tiene tres Tema Safe ™ métodos:

void Add(something); 
void Remove(index); 
int GetCount(); 
something GetElementAt(index); 

un hilo de:

for 1 to 100 do 
list.Add(12); 

Tema dos y tres:

while(list.GetCount() >0) 
{ 
    list.Remove(0); 
} 

El código anterior se bloqueará (tarde o temprano) porque la lista podría cambiar entre el momento en que llame a GetCount y Remove

Cuestiones relacionadas