thread terminar terminado subproceso reiniciar puede parametros hilos esperar ejecuciĆ³n detener delegados con cerrar cancelar c# deadlock

terminar - hilos y delegados c#



Ejemplo de interbloqueo de hilo en C# (2)

De enhebrar en C #

En el otro extremo de la escala, los contextos de sincronización separados invitan a los interbloqueos. Aquí hay un ejemplo:

[Synchronization] public class Deadlock : ContextBoundObject { public DeadLock Other; public void Demo() { Thread.Sleep (1000); Other.Hello(); } void Hello() { Console.WriteLine ("hello"); } } public class Test { static void Main() { Deadlock dead1 = new Deadlock(); Deadlock dead2 = new Deadlock(); dead1.Other = dead2; dead2.Other = dead1; new Thread (dead1.Demo).Start(); dead2.Demo(); }

Debido a que cada instancia de Deadlock se crea dentro de Test, una clase no sincronizada, cada instancia obtendrá su propio contexto de sincronización y, por lo tanto, su propio bloqueo. Cuando los dos objetos se tocan entre sí, no tarda mucho en producirse el interbloqueo (¡un segundo, para ser precisos!) El problema sería particularmente insidioso si las clases de interbloqueo y prueba fueran escritas por diferentes equipos de programación. Puede ser irrazonable esperar que los responsables de la clase de Pruebas estén al tanto de su transgresión, y mucho menos sepan cómo resolverlo. Esto contrasta con los bloqueos explícitos, donde los interbloqueos suelen ser más obvios.

¿Alguien puede dar un ejemplo de cómo se puede provocar un interbloqueo de hilos en el lenguaje C #?


static object object1 = new object(); static object object2 = new object(); public static void ObliviousFunction() { lock (object1) { Thread.Sleep(1000); // Wait for the blind to lead lock (object2) { } } } public static void BlindFunction() { lock (object2) { Thread.Sleep(1000); // Wait for oblivion lock (object1) { } } } static void Main() { Thread thread1 = new Thread((ThreadStart)ObliviousFunction); Thread thread2 = new Thread((ThreadStart)BlindFunction); thread1.Start(); thread2.Start(); while (true) { // Stare at the two threads in deadlock. } }