2011-12-09 8 views
14

Estoy tratando de inducir/causar inanición de hilo con el fin de observar los efectos en C#.Cómo simular la falta de hilo de C#

¿Alguien puede amablemente sugerir una aplicación (simple) que se puede crear para inducir el hambre de hilo?

Respuesta

11

Establecer la prioridad del hilo y el hilo afinidad

clase Trabajador

class PriorityTest 
{ 
    volatile bool loopSwitch; 
    public PriorityTest() 
    { 
     loopSwitch = true; 
    } 

    public bool LoopSwitch 
    { 
     set { loopSwitch = value; } 
    } 

    public void ThreadMethod() 
    { 
     long threadCount = 0; 

     while (loopSwitch) 
     { 
      threadCount++; 
     } 
     Console.WriteLine("{0} with {1,11} priority " + 
      "has a count = {2,13}", Thread.CurrentThread.Name, 
      Thread.CurrentThread.Priority.ToString(), 
      threadCount.ToString("N0")); 
    } 
} 

Y prueba

class Program 
{ 

    static void Main(string[] args) 
    { 
     PriorityTest priorityTest = new PriorityTest(); 
     ThreadStart startDelegate = 
      new ThreadStart(priorityTest.ThreadMethod); 

     Thread threadOne = new Thread(startDelegate); 
     threadOne.Name = "ThreadOne"; 
     Thread threadTwo = new Thread(startDelegate); 
     threadTwo.Name = "ThreadTwo"; 

     threadTwo.Priority = ThreadPriority.Highest; 
     threadOne.Priority = ThreadPriority.Lowest; 
     threadOne.Start(); 
     threadTwo.Start(); 

     // Allow counting for 10 seconds. 
     Thread.Sleep(10000); 
     priorityTest.LoopSwitch = false; 

     Console.Read(); 
    } 
} 

Código mayormente tomado de msdn también si tiene sistema de múltiples núcleos puede que tenga que configurar thread affinity. También puede necesitar crear más hilos para ver la inanición real.

+4

Buen ejemplo. Es posible que desee declarar loopSwitch como volátil para evitar problemas de optimización. – Tudor

+1

¡Gracias por la ayuda! –

+1

No incluyó ninguna afinidad en su código. En un sistema multinúcleo, este ejemplo muestra que ambos subprocesos se ejecutan durante 10 segundos (lo que no está previsto), a menos que agregue la línea al inicio: 'Process.GetCurrentProcess(). ProcessorAffinity = (System.IntPtr) 1;' (que especifica que los hilos solo se pueden programar en el primer procesador). – Virtlink

3

Establezca la afinidad de subprocesos para su aplicación en el administrador de tareas para que solo se ejecute en un núcleo. Luego, inicie un hilo ocupado en su aplicación con alta prioridad.

+0

¿Hay alguna otra forma de hacerlo a través de la codificación pura? (es decir, sin la parte del administrador de tareas) –

+0

@Sean Consulte las propiedades del proceso http://msdn.microsoft.com/en-us/library/76yt3c0w.aspx –