À 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".