スレッドとやり取りをして自分で同期をするかわりに、Dは複数コアを活用する優れた手段として メッセージパッシングが使えます。スレッドは仕事を分配しそれら自身を同期させるために、 任意の値であるメッセージを使って連絡を取り合います。スレッドたちはマルチスレッディングの よくある問題を避けるために設計によってデータを共有しません。
Dでメッセージパッシングを実装するすべての関数はstd.concurrencyモジュールにあります。
spawnはユーザ定義関数をもとにした新しいスレッドを作ります:
auto threadId = spawn(&foo, thisTid);
thisTidはstd.concurrency組み込みでメッセージパッシングに必要な
現在のスレッドを参照するものです。spawnは最初の引数としての関数と、
その関数に向けた追加の引数を引数にとります。
void foo(Tid parentTid) {
receive(
(int i) { writeln("An ", i, " was sent!"); }
);
send(parentTid, "Done");
}
receive関数はswitch-caseのように、他のスレッドから受け取った
値を、受け取った値の型により、渡されたdelegatesに送ります。
特定のスレッドにメッセージを送るのには関数sendとそのスレッドのidを使います:
send(threadId, 42);
receiveOnlyを特定の型のみを受け取るのに使えます:
string text = receiveOnly!string();
assert(text == "Done");
receiveファミリー関数は何かがスレッドのメールボックスに送られてくるまでブロックします。