2010-08-13 32 views
7

¿cómo se comunican los hilos entre sí? no usan los valores de cada uno, entonces, ¿cuál es la forma de comunicación entre ellos?¿cómo se comunican los hilos entre sí?

+0

Además de las respuestas ya dadas, marque aquí para un libro electrónico gratuito dando toda una introducción en profundidad a cómo funciona la enhebrado en C# : [Libro electrónico gratuito sobre enhebrado de C#] (http://www.albahari.com/threading/) – duesouth

Respuesta

1

Los hilos pueden compartir valores, solo tienen que tener cuidado al hacerlo. En .Net, los métodos más comunes son la instrucción lock y la clase Interlocked.

4

"no usan valores entre sí" - bien dos hilos en el mismo proceso pueden ver variables comunes, por lo que es la appraoch más simple. Entonces usamos varias sincronizaciones, bloqueos, mutices y sempahores para esperar las condiciones y activar los hilos en espera.

En Java, utiliza varias primitivas, como la sincronización. Puede leer esto tutorial

+0

+1 No entiendo por qué no se tiene en cuenta este hecho. – Luca

5

Hay algunas formas en que los hilos se pueden comunicar entre sí. Esta lista no es exhaustiva, pero sí incluye las estrategias más utilizadas.

  • de memoria compartida, como una variable o alguna otra estructura de datos
  • primitivas de sincronización, como cerraduras y sempahores
  • eventos, como ManualResetEvent o AutoResetEvent

Memoria compartida

public static void Main() 
{ 
    string text = "Hello World"; 
    var thread = new Thread(
    () => 
    { 
     Console.WriteLine(text); // variable read by worker thread 
    }); 
    thread.Start(); 
    Console.WriteLine(text); // variable read by main thread 
} 

primitivas de sincronización

public static void Main() 
{ 
    var lockObj = new Object(); 
    int x = 0; 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     lock (lockObj) // blocks until main thread releases the lock 
     { 
      x++; 
     } 
     } 
    }); 
    thread.Start(); 
    while (true) 
    { 
    lock (lockObj) // blocks until worker thread releases the lock 
    { 
     x++; 
     Console.WriteLine(x); 
    } 
    } 
} 

Eventos

public static void Main() 
{ 
    var are = new AutoResetEvent(false); 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     Thread.Sleep(1000); 
     are.Set(); // worker thread signals the event 
     } 
    }); 
    thread.Start(); 
    while (are.WaitOne()) // main thread waits for the event to be signaled 
    { 
    Console.WriteLine(DateTime.Now); 
    } 
} 
+1

+1 para completar. –

Cuestiones relacionadas