スレッドとやり取りをして自分で同期をするかわりに、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
ファミリー関数は何かがスレッドのメールボックスに送られてくるまでブロックします。