Passage de messages

À la place de gérer le parallélisme et la synchronisation à la main, D permet d'utiliser le passage de messages pour exploiter le puissance des CPU à plusieurs cœurs. Les threads communiquent avec des messages, qui contiennent des valeurs arbitraires, pour se partager le travail et se synchroniser. Ils s'interdisent de partager des données pour éviter beaucoup de problèmes liés au parallélisme.

Toutes les fonctions qui implémentent le passage de messages en D peuvent être trouvées dans le module std.concurrency.

spawn créé un nouveau thread à partir d'une fonction fournie par l'utilisateur:

auto threadId = spawn(&foo, thisTid);

thisTid est une variable définie dans std.concurrency qui fait référence au thread actuel, une information nécessaire pour le passage de messages. spawn prend une fonction en premier argument et un nombre arbitraire d'autres paramètres qui fonctionnent comme arguments de la fonction.

void foo(Tid parentTid)
{
    receive(
        (int i) { writeln("Un ", i, " a été envoyé!"); }
    );

    send(parentTid, "Fait");
}

La fonction receive fonctionne comme un switch-case qui réparti les valeurs envoyées par les autres threads à des delegates en fonction du type de la valeur.

Pour envoyer un message à un thread spécifique, on utilise la fonction send avec son id:

send(threadId, 42);

receiveOnly peut être utilisé pour ne recevoir qu'un certain type de valeurs:

string text = receiveOnly!string();
assert(text == "Done");

La famille des fonctions receive bloque l'exécution du thread jusqu'à réception d'un message dans sa "boite aux lettres".

Pour aller plus loin

rdmd playground.d