import std.stdio, std.concurrency;
void spawnedFunc(Tid ownerTid) // ownerTid нужен, чтобы знать, кому отправлять ответ
{
int saved;
receive( // ждем сообщение
(int i){ saved = i; }, // - если получим int
(float f) { writeln("Received a float."); },
(Variant v) { writeln("Received some other type."); }
);
send( ownerTid, ++saved );
// Теперь ждем второе сообщение.
// Если получаемых сообщений больше единицы,
// они будут упакованы в std.typecons.Tuple:
auto msg = receiveOnly!(int, string)();
writefln("Message with two values: %s", msg);
// при несовпадении типов будет брошено MessageMismatch
// попытка в третий раз получить сообщение вернет OwnerTerminated
// потому, что родительский поток ничего не прислал и уже ушел.
receive(
(Variant v){ writefln("When parent ended: %s", v); }
);
}
void main()
{
auto childTid = spawn(&spawnedFunc, thisTid); // новый поток запустит spawnedFunc( thisTid)
childTid.send( 42); // или send( childTid, 42) - отправить число 42
auto ans = receiveOnly!(int); // ждем только тип int
writefln("Got answer: %s", ans);
send( childTid, 42, "42"); // теперь отправить два значения
}
Создается дочерний поток childTid , который запускает функцию spawnedFunc, которая принимает параметр типа Tid (Thread ID). Запустившись, функция spawnedFunc сначала ожидает сообщение любого типа. В случае типа int выполняется присвоение заранее объявленной переменной saved. После получения одного сообщения, отравляется ответ потоку ownerTid. Ответ содержит принятое целое число, увеличенное на единицу. После дочерний поток ожидает сообщение с двумя значениями int и string. Получив сообщение в виде кортежа, поток печатает полученное значение внутри строки "Message with two values..." .
Основной поток после создания дочернего потока childTid, отправляет ему число 42. После этого получает ответ и печатает его на stdout. После отправляет еще пару значений ( 42, "42").
Performing "debug" build using dmd for x86_64.
spawn-and-responce ~master: building configuration "application"...
Linking...
Running ./spawn-and-responce
Got answer: 43
Message with two values: Tuple!(int, string)(42, "42")
When parent ended: std.concurrency.OwnerTerminated@std/concurrency.d(241): Owner terminated
Аргументы функции Tid spawn(F, T...)(F fn, T args)
должны быть либо immutable
либо shared
( См. доку по функции spawn
модуля concurrency
. )