En lugar de trabajar directamente con hilos de ejecución y realizar todas las tareas de sincronización uno mismo, D permite usar paso de mensajes como un medio para aprovechar la potencia de varios procesadores. Los hilos pueden comunicarse con mensajes, que no son más que valores arbitrarios, para distribuir el trabajo y para sincronizarse entre ellos. Los hilos no comparten datos por diseño, lo que evita los problemas más comunes de entornos multihilo.
Todas las funciones que implementan el paso de mensajes en D se pueden encontrar
en el módulo std.concurrency
.
Por ejemplo, spawn
crea un nuevo hilo de ejecución al que se le pasa la
función que ha de ejecutar:
auto threadId = spawn(&foo, thisTid);
La variable thisTid
es una variable interna al módulo std.concurrency
que
hace referencia al hilo actual, necesario para realizar el paso de mensajes.
A la función spawn
hay que pasarle otra función como primer parámetro, que
será la función que ejecute el hilo, mientras que el resto de parámetros son
los argumentos pasados a esta primera función.
void foo(Tid parentTid) {
receive(
(int i) { writeln("An ", i, " was sent!"); }
);
send(parentTid, "Done");
}
La función receive
funciona de forma parecida a como lo hace la expresión
switch..case
, despachando los valores que recibe desde otros hilos para
posteriormente pasar dichos valores a delegados (delegate
s) dependiendo
del tipo de dato recibido.
Para enviar un mensaje a un hilo específico se usa la función send
junto con
el ID del hilo de destino:
send(threadId, 42);
La función receiveOnly
se usa para recibir exclusivamente un tipo de dato:
string text = receiveOnly!string();
assert(text == "Done");
La familia de funciones receive
se bloquean hasta que algún dato se envíe
al hilo que llama a dicha función.