concurrency

concurrency

Простой обмен сообщениями между двумя потоками

spawn, send, receive, receiveOnly!, Variant, OwnerTerminated

Код

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

Примечания про spawn

Аргументы функции Tid spawn(F, T...)(F fn, T args) должны быть либо immutable либо shared( См. доку по функции spawn модуля concurrency. )

results for ""

    No results matching ""