Paso de mensajes

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 (delegates) 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.

En profundidad

rdmd playground.d