2012-06-11 7 views
6

Tengo una pregunta. Es posible y válido, si tengo un objeto con un método DoSomething(), si creo múltiples hilos para este método, ¿funcionará y se ejecutará como un hilo independiente?Creando múltiples hilos para el mismo método en una instancia en un objeto

E.g.

public class SomeClass 
{ 
    public void DoSomething() 
    { 
     //somethings done here 
    } 
} 

public class MainProgram 
{ 
    public MainProgram() 
    { 
     InitializeComponents(); 
    } 

    protected override OnStart(string[] args) 
    { 
     SomeClass sc = new SomeClass(); 
     Thread workerOne = new Thread(() => sc.DoSomething()); 
     workerOne.Start(); 

     Thread workerTwo = new Thread(() => sc.DoSomething()); 
     workerTwo.Start(); //start a new thread calling same method 
    } 
} 

Espero que eso explique a qué me refiero. ¿Esto funcionaría o causaría algún problema?

Estoy escribiendo un programa que necesita casi ser software en tiempo real, actualmente estoy decidiendo si la inicialización de una nueva instancia de SomeClass es mejor o no?

Espero que alguien pueda responder. Si mi pregunta no tiene sentido, ¡por favor comenten y les explicaré más!

Gracias,

Base33

PS El código fue escrito específicamente para el ejemplo :)

+0

¿qué versión de C#/.NET estás? – RobertMS

+0

Enlace obligatorio: [ebook gratis de Joe Albahari] (http://www.albahari.com/threading/) –

+0

Soy un programador de Java. Pero después de examinar su código más de cerca, parece que puede reutilizar la misma instancia de SomeClass. Aunque, solo un hilo podrá ejecutar el método mientras el otro espera su turno. Al menos eso es lo que sucede en Java. – CKing

Respuesta

12

Cada subproceso tiene una pila de llamadas separada, por lo que ambos pueden estar utilizando el mismo método en el mismo objeto. Y de hecho, si es necesario, cada hilo puede (mediante recursión) llamar al mismo método en la misma instancia varias veces si realmente lo desea.

Sin embargo, lo que podría tropezar es si está utilizando estado en ese objeto (instancia o campos estáticos, etc., y cualquier cosa relacionada de ese estado). Deberá asegurarse de que su acceso a cualquier estado compartido otorgue plena consideración (y presumiblemente sincronización) al acceso de subprocesos múltiples.

3

sí se puede hacer eso. Sin embargo, deberá asegurarse de que sus accesos de miembro dentro de ese método sean seguros para la ejecución de subprocesos.

Si modifica el estado del objeto, debe bloquear las lecturas y escrituras (sin hablar de ningún mecanismo en particular) o verificar que es inofensivo interrumpir el método en un momento dado y que la otra invoque un hilo diferente seguirá funcionando correctamente

1

¿Es posible y válido, si tengo un objeto con un método DoSomething(), si creo múltiples hilos para este método, ¿funcionará y se ejecutará como un hilo separado propio?

Sí es posible. En su ejemplo de código, se llama a DoSomething en la misma instancia de SomeClass. Ambos hilos comparten esto. Tienes dos hilos distintos pero un objeto real que se comparte.

¿Funcionaría o causaría algún problema?

Eso depende completamente de su caso de uso. Puede o no. Si los objetos son compartidos, necesita sincronizar el acceso a ellos.

1

No tiene ningún problema. Correré sin ningún error.

Es como crear un objeto y llamar al método en este objeto dos veces. El único hecho es que dos ocurrencias de llamadas del mismo método están en el hilo diferente.

Cuestiones relacionadas