メッセージパッシング

スレッドとやり取りをして自分で同期をするかわりに、Dは複数コアを活用する優れた手段として メッセージパッシングが使えます。スレッドは仕事を分配しそれら自身を同期させるために、 任意の値であるメッセージを使って連絡を取り合います。スレッドたちはマルチスレッディングの よくある問題を避けるために設計によってデータを共有しません。

Dでメッセージパッシングを実装するすべての関数はstd.concurrencyモジュールにあります。 spawnはユーザ定義関数をもとにした新しいスレッドを作ります:

auto threadId = spawn(&foo, thisTid);

thisTidstd.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ファミリー関数は何かがスレッドのメールボックスに送られてくるまでブロックします。

掘り下げる

rdmd playground.d